2011-09-21 33 views
1

我有一個簡單的CMFCRibbonProgressBar和一個線程,它在長時間的操作過程中調用SetPos(value,TRUE)。 的問題是,在調試模式下它WINCORE.CPP斷言這一點:如何從不同的線程調用CMFCRibbonProgressBar方法?

CHandleMap* pMap = afxMapHWND(); 
    ASSERT(pMap != NULL); 

我通過在該文件中,我不應該從不同的線程中調用它,因爲它可能是危險的意見理解。 我的問題是如何獲得一個線程來更新進度條的位置? 我很想試着忽略這個斷言,並繼續在發佈模式,但這是非常邪惡的...

有什麼建議嗎?

回答

0

好的,有人對這個問題作了非常簡短的評論,他們有正確的答案。我不知道他們爲什麼撤回他們的評論:/

我結束了在CMFCRibbonProgressBar派生類中存儲CWnd *指針,並且每當我從工作者線程調用「SetAmountCompleted」方法時,我使用CWnd發送一個帶有指向WPARAM中派生類的指針的自定義消息。 接收消息的CWnd然後提取指針並調用將重繪進度條的Update方法。

它很複雜,很醜,它是MFC。唷。

+2

不,它不是MFC,也不難看。事實是,從不同於創建它的線程處操作窗口是一個禁忌。正確的策略是以某種方式將更新請求發送到UI線程(發佈WM_USER + x是個好主意),並讓處理程序找出如何完成任務。無論如何,工作人員不應該知道你的用戶界面的細節。 –

+0

工作人員不知道有關UI的任何信息,它只獲取指向具有SetTotal和SetAmountCompleted的接口IProgressNotification的指針。 CMFCRibbonProgressBar派生類繼承自那個和所述功能區進度條。實際上,實際的工作線程是在一個單獨的庫中,並不知道任何MFC。正如你可以看到的問題是,這個派生類接收通知,然後更新用戶界面,這是MFC不喜歡的。相反,現在我必須參與一些CWnd的骯髒業務,這隻會增加複雜性:/ –

相關問題