我正在做一个C/C++项目,它涉及一个UI和一个后台服务,它通过网络获取数据来执行一些繁重的处理。为了使我的UI不会变得无响应,我希望生成一个单独的线程,然后调用该线程中的后台服务,而另一个线程将在UI中显示忙碌指示。一旦后台服务完成了它的工作,我希望将线程上下文从后台线程切换到UI线程,以便删除繁忙指示,并且可以显示更多的屏幕流程。我相信这是大多数UI通常的工作方式。我想知道的是,实现这一目标的有效和最好的方法是什么。目前,我还没有实现上述代码,我只是要求想法和最好的方法来做到这一点。
平台是Linux。我使用的UI框架是一个自定义的UI框架,它提供了一个用于UI开发的SDK,但与大多数UI框架不同的是,它不会为我提到的场景提供任何东西。它几乎是一个被弃用的框架,但它需要用于这个项目,这是一个痛苦的问题,所以唯一的选择是我可以使用Pthread或System v,在实际调用上使用一些包装器,这将帮助我保持实现在不同平台上的可移植性。
由于嵌入式环境的某些限制,我不能使用Boost Thread。
任何关于上下文切换如何发生的建议和解释都将是非常有用的。
发布于 2010-11-09 21:32:17
首先,您对线程的工作方式感到困惑。你不能随意切换线程上下文,只要操作系统愿意,它就会这么做。
其次,如果您关心的是上下文切换开销,那么您正在做的事情是非常错误的()。
最后,UI通常具有事件驱动的体系结构。通常,你有一个“主”线程运行一个处理各种事件的事件循环。因此,正确的方法是让后台线程将进度事件发送到“主”线程。您必须以线程安全的方式完成此操作;确切的细节取决于UI工具包。
发布于 2010-11-09 21:35:44
我有一个用来创建和使用线程和互斥的sample code。示例中的线程并发地锁定互斥锁/增量变量/解锁互斥锁。您可能需要的是一个条件变量(相同的初始化模式),然后将拥有基于pthread的任务运行器线程实现所需的全部原语。而且你也不会依赖于任何第三方的库。
发布于 2010-11-09 22:17:33
让我试着用一个高水平的答案来帮助你。
您确实可以查看posix线程(一个用于UI,一个或多个用于后端处理)。当然,您需要在它们之间进行同步;这意味着还需要查看诸如互斥锁、易失性关键字或自旋锁之类的主题。
根据您对每个主题的满意程度,尝试在过去的问题中搜索这些主题。
祝好运
https://stackoverflow.com/questions/4134100
复制相似问题