开发者

C++ MultiThreading with visual studio express 2010 Forms Application

I am developing a Windows forms application which connects to a piece of hardware, acquires a lot of data (~1 GSample/sec), processes it, and spits it out to the screen upon a button click. I am now trying to automate the process in a loop that can be started/stopped at any time so I can monitor it whilst tweaking the input to the acquisition hardware. I thinks it's clear that I need to do this on a separate thread, but I'm having a heck of a time trying to do this in c++/cli - I have found a number of good examples using MFC, which is not supported by Express.

Specifically: My task is to press a button whi开发者_如何转开发ch is handled in Form1.h, to call a function in my main file Acquisition.cpp which contains the following code (currently an infinite loop)

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

I wish to execute this code in a separate thread so that the main program can listen for the user request to stop the operation. Without threading, I currently have to forcefully quit the program (or set it to run a fixed number of times) to stop it.

Is there any suggestions how I might go about running this code on a separate thread?

I've (unsuccessfully) tried a few things already:

  1. Modifying the example given in This Microsoft Example. Problem: requires /clr:oldSyntax option which is incompatible with the other 1300 lines of code in the program.

  2. Trying to do what I'd do in Java (Declare a global thread and start/stop it from any point in the code. Problem: Compiler won't let me declare a global System::Threading.Thread

  3. this beautiful example. Problem: Requires MFC.

Any suggestions would be greatly appreciated!


You can use a BackgroundWorker or a Thread to handle this. You'll need to make sure that the portion of your work that updates the UI is marshaled back to the UI thread, however.

Here is a tutorial on threading in C++/CLI.


For the record, upon Reed's suggestion about using a BackgroundWorker, I sifted through the code at the bottom of this page and modified my code so that:

  1. It created a new backgroundWorker BGWorker in which BGWorker->DoWork() called my realTimeUpdate() function.

  2. A button on the main Form calls either RunWorkerAsync() or CancelAsync() depending on whether or not the process is running (checked by a boolean flag in my main program).

  3. The realTimeUpdate() function is now passed a BackgroundWorker - realTimeUpdate(BackgroundWorker^ worker, DoWorkEventArgs ^ e) After each calculation is complete within the internal loop, it calls worker->ReportProgress(result) function. In the BGWorker->ProgressChanged() function a separate function, upDataUI(int) draws the result on the main form.

Thanks again for the help.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜