【问题标题】:C++ MultiThreading with visual studio express 2010 Forms ApplicationC++ 多线程与 Visual Studio Express 2010 表单应用程序
【发布时间】:2011-04-15 00:32:28
【问题描述】:

我正在开发一个 Windows 窗体应用程序,该应用程序连接到一个硬件,获取大量数据(~1 GSample/sec),处理它,并在单击按钮时将其吐出到屏幕上。我现在正在尝试在一个可以随时启动/停止的循环中自动化该过程,以便我可以在调整采集硬件的输入的同时对其进行监控。我认为很明显我需要在一个单独的线程上执行此操作,但我有一段时间尝试在 c++/cli 中执行此操作 - 我找到了许多使用 MFC 的好示例,这些示例不受支持快递。

具体来说:我的任务是按下一个在 Form1.h 中处理的按钮,在我的主文件 Acquisition.cpp 中调用一个函数,其中包含以下代码(当前是一个无限循环)

void Form1::realTimeUpdate()  
{  
    // live is a boolean variable set by a button on the form
    while(live)  
    {  
        displayVariance(getVar(getQuadratures(100),nbrSamples));  
    }  
}  

我希望在单独的线程中执行此代码,以便主程序可以监听用户请求以停止操作。在没有线程的情况下,我目前必须强制退出程序(或将其设置为运行固定次数)才能停止它。

对我如何在单独的线程上运行此代码有什么建议吗?

我已经(不成功)尝试了一些方法:

  1. 修改This Microsoft Example中给出的示例。问题:需要 /clr:oldSyntax 选项,该选项与程序中其他 1300 行代码不兼容。

  2. 尝试做我在 Java 中所做的事情(声明一个全局线程并从代码中的任何位置开始/停止它。问题:编译器不允许我声明一个全局 System::Threading.Thread

  3. this 漂亮的例子。问题:需要 MFC。

任何建议将不胜感激!

【问题讨论】:

  • 我只是在主窗口发布一条消息,但我是老派!

标签: multithreading visual-studio-2010 visual-c++ c++-cli visual-c++-2010


【解决方案1】:

您可以使用 BackgroundWorker 或 Thread 来处理此问题。但是,您需要确保将更新 UI 的工作部分编组回 UI 线程。

这是tutorial on threading in C++/CLI

【讨论】:

  • 谢谢 Reed,我不知道 BackgroundWorker。事实证明这是要走的路。我在下面发布了它的帮助。
【解决方案2】:

为了记录,根据 Reed 关于使用 BackgroundWorker 的建议,我筛选了 this 页面底部的代码并修改了我的代码,以便:

  1. 它创建了一个新的 backgroundWorker BGWorker,其中 BGWorker->DoWork() 调用了我的 realTimeUpdate() 函数。

  2. 主窗体上的按钮调用 RunWorkerAsync() 或 CancelAsync(),具体取决于进程是否正在运行(由我的主程序中的布尔标志检查)。

  3. realTimeUpdate() 函数现在传递了一个 BackgroundWorker - realTimeUpdate(BackgroundWorker^ worker, DoWorkEventArgs ^ e) 在内部循环中完成每个计算后,它调用 worker->ReportProgress(result) 函数。在 BGWorker->ProgressChanged() 函数中一个单独的函数,upDataUI(int) 在主窗体上绘制结果。

再次感谢您的帮助。

【讨论】: