问题描述
|
我正在开发一个Windows窗体应用程序,该应用程序连接到一块硬件,获取大量数据(〜1 GSample / sec),对其进行处理,并在单击按钮时将其吐到屏幕上。现在,我试图在一个可以随时启动/停止的循环中自动执行该过程,以便在调整采集硬件的输入时可以对其进行监视。我认为很明显,我需要在单独的线程上执行此操作,但是我在c ++ / cli中尝试执行此操作的时间很短-我发现了许多使用MFC的很好的示例, Express不支持。
具体来说:我的任务是按下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));
}
}
我希望在单独的线程中执行此代码,以便主程序可以侦听用户请求以停止操作。没有线程,我目前必须强制退出程序(或将其设置为运行固定的次数)以停止它。
有什么建议我应该如何在单独的线程上运行此代码?
我已经(未成功)尝试了一些方法:
修改此Microsoft示例中给出的示例。问题:需要/ clr:oldSyntax选项,该选项与程序中的其他1300行代码不兼容。
尝试做我在Java中要做的事情(声明一个全局线程,并从代码的任何位置启动/停止它。问题:编译器不允许我声明一个全局System :: Threading.Thread
这个美丽的例子。问题:需要MFC。
任何建议将不胜感激!
解决方法
您可以使用BackgroundWorker或Thread来处理。但是,您需要确保将更新UI的工作部分编组回UI线程。
这是有关C ++ / CLI中的线程的教程。
,作为记录,在Reed关于使用BackgroundWorker的建议下,我筛选了此页底部的代码,并修改了我的代码,以便:
它创建了一个新的backgroundWorker BGWorker,其中BGWorker-> DoWork()调用了我的realTimeUpdate()函数。
主窗体上的按钮将根据进程是否正在运行来调用RunWorkerAsync()或CancelAsync()(由主程序中的布尔标志检查)。
现在将realTimeUpdate()函数传递给BackgroundWorker-
realTimeUpdate(BackgroundWorker^ worker,DoWorkEventArgs ^ e)
内部循环中的每个计算完成后,它将调用worker-> ReportProgress(result)函数。在BGWorker-> ProgressChanged()函数中,一个单独的函数upDataUI(int)在主窗体上绘制结果。
再次感谢您的帮助。