5

私は、ハードウェアに接続し、大量のデータ(〜1 GSample /秒)を取得して処理し、ボタンをクリックすると画面に出力するWindowsフォームアプリケーションを開発しています。現在、取得ハードウェアへの入力を調整しながら監視できるように、いつでも開始/停止できるループでプロセスを自動化しようとしています。別のスレッドでこれを行う必要があることは明らかだと思いますが、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. このMicrosoftの例に示されている例を変更します。問題:プログラム内の他の1300行のコードと互換性のない/ clr:oldSyntaxオプションが必要です。

  2. Javaで行うことを実行しようとしています(グローバルスレッドを宣言し、コード内の任意の場所から開始/停止します。問題:コンパイラーでグローバルSystem::Threading.Threadを宣言できません

  3. この美しい例。問題:MFCが必要です。

任意の提案をいただければ幸いです!

4

2 に答える 2

1

これを処理するには、BackgroundWorkerまたはスレッドを使用できます。ただし、UIを更新する作業の一部が、UIスレッドにマーシャリングされていることを確認する必要があります。

これは、C ++/CLIでのスレッド化に関するチュートリアルです。

于 2011-04-15T00:37:03.057 に答える
0

記録のために、BackgroundWorkerの使用に関するReedの提案に応じて、この ページの下部にあるコードをふるいにかけ、次のようにコードを変更しました。

  1. これにより、BGWorker-> DoWork()が私のrealTimeUpdate()関数を呼び出す新しいbackgroundWorkerBGWorkerが作成されました。

  2. メインフォームのボタンは、プロセスが実行されているかどうかに応じて、RunWorkerAsync()またはCancelAsync()のいずれかを呼び出します(メインプログラムのブールフラグによってチェックされます)。

  3. realTimeUpdate()関数にBackgroundWorkerが渡されるようになりました-realTimeUpdate(BackgroundWorker^ worker, DoWorkEventArgs ^ e)内部ループ内で各計算が完了すると、worker-> ReportProgress(result)関数が呼び出されます。BGWorker-> ProgressChanged()関数では、upDataUI(int)がメインフォームに結果を描画します。

助けてくれてありがとう。

于 2011-04-16T16:11:03.407 に答える