我正在编写我的第一个线程应用程序,用于具有非常快的线速度的工业机器。我正在使用MFC作为用户界面,一旦用户按下"开始"机器按钮,我需要同时执行三个操作。我需要收集数据,处理数据并快速输出结果,以及检查用户是否已关闭机器"关闭"。当我说得很快时,我希望执行的分析部分花费的时间最长,而且需要在一秒钟之内完成。我主要关注与线程相关的开销消除。下面实现循环的最快方法是什么:
void Scanner(CString& m_StartStop) {
std::thread Collect(CollectData);
while (m_StartStop == "Start") {
Collect.join();
std::thread Analyze(AnalyzeData);
std::thread Collect(CollectData);
Analyze.join();
std::thread Send(SendData);
Send.join();
}
}
我意识到这个样本可能远离基础,但希望它能够解决问题。我应该创建三个线程并暂停它们而不是一遍又一遍地创建和连接它们吗?此外,我有点不清楚UI是否需要自己的线程,因为用户需要能够随时暂停或停止该线路。
如果有人想知道为什么这需要线程而不是顺序,答案是机器的线速度将导致需要在分析第一部分时收集第二部分的数据。每1秒相当于3英尺的线性部件向下移动。
答案 0 :(得分:1)
在考虑实施之前考虑一下功能问题。
因此,我们需要收集,分析并发送到其他地方的连续数据流,并有一个监督点,以便能够停止暂停流程。
您只需要确保最慢的部分必须是收集。
这是线程的正确用例。实施可以使用:
一个连续
的线程Optionnaly,你可以有一个单独的线程来处理输出。在这种情况下,最后一行变为
我们必须添加:
一个连续
的线程您必须提供一种方法来通知完全外部程序和信号机制或GUI线程暂停或退出请求
答案 1 :(得分:0)
您需要的任何线程都应该已经运行,等待工作。您不应该创建或加入线程。
如果作业A必须在作业B可以启动之前完成,作业A的完成应该触发作业B的开始。也就是说,当作业A完成作业A的线程时,它应该自己做作业B或者触发派遣工作B.不应该是等待工作A完成的其他线程,以便能够开始工作B.