5

我正在開發一個Windows窗體應用程序連接到一個硬件,獲取大量的數據(〜1 GSample /秒),處理它,並吐出到屏幕點擊按鈕。我現在試圖在一個可以隨時啓動/停止的循環中自動化這個過程,這樣我就可以在調整採集硬件的輸入的同時監視它。我認爲很明顯,我需要在一個單獨的線程上做到這一點,但我有一段時間試圖在C++/cli中做到這一點 - 我發現了一些使用MFC的好例子,這是不支持的表現。C++多線程與視覺演播室快遞2010窗體應用程序

具體做法是:我的任務是按它在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

任何建議,將不勝感激

+0

我只是發佈消息到主窗口,但我是老派! – 2011-04-16 16:24:23

回答

1

您可以使用一個BackgroundWorker或線程來處理這一點,您需要確保!。那個但是,更新UI的部分工作將封送回UI線程。

這是tutorial on threading in C++/CLI

+0

謝謝里德,我不知道BackgroundWorker。事實證明,這是一條路。我發佈瞭如何幫助下面。 – Orko 2011-04-16 16:18:47

0

爲了記錄在案,在裏德的有關使用BackgroundWorker的建議,我通過代碼篩選在this頁面的底部,並修改了代碼,以便:

  1. 它創建了一個新的BackgroundWorker BGWorker其中BGWorker - > DoWork()稱爲我的realTimeUpdate()函數。

  2. 取決於進程是否正在運行(由我的主程序中的布爾標誌檢查),主Form上的一個按鈕調用RunWorkerAsync()或CancelAsync()。

  3. realTimeUpdate()函數現在傳遞給BackgroundWorker - realTimeUpdate(BackgroundWorker^ worker, DoWorkEventArgs^e)在內部循環內完成每個計算後,它會調用worker-> ReportProgress(result)函數。在BGWorker-> ProgressChanged()函數中,一個單獨的函數upDataUI(int)在主窗體上繪製結果。

再次感謝您的幫助。

相關問題