2010-05-16 78 views
0

我在C++中創建了一個應用程序內核,我已經將它編譯爲Visual Studio中的一個靜態庫。我現在正在爲它編寫一個GUI。 我正在使用MFC來做到這一點。我想出瞭如何映射按鈕來執行我的應用程序核心的主類的某些方法(即按鈕來啓動和停止)。然而,核心類應該每隔一兩秒鐘從外部源採樣數據。然後在每次採樣之後GUI應該填充一些字段。我似乎無法在MFC對象中找到像CDialog這樣的位置,我可以經常檢查以查看我的類是否抓取了數據,然後如果它已將該數據放入某些文本框中。我在哪裏放置我的MFC程序的邏輯?

一位朋友建議我在OnInit()例程上創建一個線程來處理此問題,但該解決方案對我來說並不真正起作用。

是否沒有位置,我可以把一個if語句不斷調用,直到程序退出?

if(coreapp.dataSampleReady()) { 
    // put coreapp.dataItem1() in TextBox1 
    // set progress bar to coreapp.dataItem2() 
    // etc. 
    // reset dataSampleReady 
} 

回答

1

您提到「每一秒鐘或兩秒鐘」,而另一個答案建議「使用事件驅動範例」。如何在對話框中設置定時器以及定時器何時觸發,從外部源採樣數據。你指出你已經想出瞭如何映射按鈕的事件處理程序,所以將一個處理程序映射到定時器應該是你的自然延伸。

+0

得到你的CWinApp派生類。我想了一會兒,所以這是我用作解決方案。正如我的dataSampleReady()下面只是輪詢時鐘的時間,並將其與「輪詢時間」進行比較。 – MrD 2010-06-10 04:41:00

1

我想你可以把它放在OnIdle

儘管使用事件驅動範例會更好,但由於輪詢系統會過度吸收CPU功率。因此,你有一個線程位於WaitForSingleObject。當設置dataSampleReady時,您只需觸發線程正在等待的事件。這樣你就不會不斷吸取CPU的能力來檢查一些東西。它會把時間花在其他進程和線程上,直到需要爲止。

+0

OnIdle的問題是,我的appcore類是我的CDialog類的成員,它是CWinApp類的成員。 我的解決方案是讓CDialog的構造函數把一個指向我的coreapp的指針(然後將它保存爲一個成員),並在CWinApp類中創建我的coreapp類? – MrD 2010-05-16 15:22:40

+0

OnIdle當然可以在對話框中調用訪問器成員?不要忘了,你總是可以通過AfxGetApp() – Goz 2010-05-17 20:57:46

相關問題