线程 - 处理重新线程的最快方法?

时间:2015-12-09 22:05:28

标签: c++ multithreading mfc

我正在编写我的第一个线程应用程序,用于具有非常快的线速度的工业机器。我正在使用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英尺的线性部件向下移动。

2 个答案:

答案 0 :(得分:1)

在考虑实施之前考虑一下功能问题。

因此,我们需要收集,分析并发送到其他地方的连续数据流,并有一个监督点,以便能够停止暂停流程。

  • 集合应受输入流量的限制
  • 分析应该只限于cpu
  • 发送应该受到约束

您只需要确保最慢的部分必须是收集。

这是线程的正确用例。实施可以使用:

  • 一个输入缓冲区池,由collect任务填充并由analyze task使用
  • 一个连续的线程:
    • 控制是否应退出(专用变量)
    • 从池中获取输入对象
    • 用数据填充
    • 将其传递给分析任务
  • 一个连续

    的线程
    • 等待收集任务中的第一个输入对象和退出
    • 的请求
    • 分析对象并准备输出
    • 发送输出

    Optionnaly,你可以有一个单独的线程来处理输出。在这种情况下,最后一行变为

    • 将输出对象传递给发送任务

    我们必须添加:

  • 一个连续

    的线程
    • 等待分析任务中的第一个输出对象和退出请求
    • 发送输出

您必须提供一种方法来通知完全外部程序和信号机制或GUI线程暂停或退出请求

答案 1 :(得分:0)

您需要的任何线程都应该已经运行,等待工作。您不应该创建或加入线程。

如果作业A必须在作业B可以启动之前完成,作业A的完成应该触发作业B的开始。也就是说,当作业A完成作业A的线程时,它应该自己做作业B或者触发派遣工作B.不应该是等待工作A完成的其他线程,以便能够开始工作B.