[size=16px]實作功能如下:
程式中有2個執行緒:主執行緒和子執行緒。
主執行緒發送訊息給子執行緒(postthreadmessage)后做別的事,子執行緒回圈等待(while)主執行緒的訊息,然后進行相應的處理。子執行緒處理結束后,再把處理結果(如變數a)發送給主執行緒,主執行緒收到子執行緒發送來的訊息后就保存變數a,然后繼續做自己的事。
我的問題是:
主執行緒如何知道子執行緒何時發送來訊息,不能使用回圈等待,因為主執行緒要做別的事。[/size
另外,不使用視窗
剛接觸這方面,折騰了兩天,希望大家幫忙,謝謝
uj5u.com熱心網友回復:
子執行緒給主執行緒發訊息:::PostMessage你在重新自定義一個訊息處理函式就可以了.
uj5u.com熱心網友回復:
一個執行緒::PostMessage另一個執行緒就知道有執行緒到來uj5u.com熱心網友回復:
那主執行緒如何知道子執行緒何時發送來訊息啊?不能使用回圈等待,因為主執行緒要做別的事[/size]uj5u.com熱心網友回復:
可postmessage是將一個訊息放入與指定視窗創建的執行緒相聯系的的訊息佇列里,但我沒有使用視窗啊,主執行緒就是main函式uj5u.com熱心網友回復:
你的主執行緒是WIN32程式,那就把這2個事件都放到2個子執行緒中去做。通過事件同步,或者執行緒之間發訊息來完成.
uj5u.com熱心網友回復:
如果只建立一個子執行緒,那子執行緒該如何發訊息(postmessage?)給創建它的執行緒呢?
uj5u.com熱心網友回復:
可postmessage是將一個訊息放入與指定視窗創建的執行緒相聯系的的訊息佇列里,但我沒有使用視窗啊,主執行緒就是main函式
你的主執行緒是WIN32程式,那就把這2個事件都放到2個子執行緒中去做。通過事件同步,或者執行緒之間發訊息來完成.
如果只建立一個子執行緒,那子執行緒該如何發訊息(postmessage?)給創建它的執行緒呢?
你的主執行緒(WIN32)沒有訊息回圈,postmessage怎么可能,你開單個執行緒和主執行緒之間操作,這個設計有問題啊。
執行緒之間發訊息可以通過postthreadmessage
uj5u.com熱心網友回復:
我現在的做法是:在主執行緒中利用GetCurrentThreadId獲得主執行緒的ID,然后在子執行緒中postthreadmessage指定主執行緒ID,便可發訊息給主執行緒。但如何讓主執行緒只管發送指令給子執行緒,當有來自子執行緒的訊息時便保存。沒有訊息時就做別的事。???
uj5u.com熱心網友回復:
謝謝華美樂章,我剛接觸這些,之前的程式只有主執行緒,需要等待某個任務執行的結果。現在不想等待,當收到結果就處理一下,沒有訊息時可以去做別的任務。那該怎么設計呢?uj5u.com熱心網友回復:
示例代碼。主執行緒發送WMCALC訊息給子執行緒。
子執行緒處理完后。發送WMDISPLAY訊息回傳給
主執行緒。主執行緒繼續處理。
本人親測,成功執行。
子執行緒自己處理自己的訊息回圈
//-------------------------------------------------
#define WM_CALC WM_USER+1
子執行緒派生類
class CUIThread : public CWinThread
{
DECLARE_DYNCREATE(CUIThread)
public:
CUIThread(); // protected constructor used by dynamic creation
virtual ~CUIThread();
public:
virtual BOOL InitInstance();
virtual int ExitInstance();
CUIThreadDlg m_Dlg;
protected:
DECLARE_MESSAGE_MAP()
afx_msg void OnCalcaulate(UINT wParam,LONG lParam);
};
//---------------------------------------------------
impletation
BOOL CUIThread::InitInstance()
{
// TODO: perform and per-thread initialization here
return TRUE;
}
//---------------------------------------------------
主執行緒發送訊息給另一CWINTHREAD界面執行緒WMCALC
CUIThread* m_pCalculateThread=
(CUIThread*)AfxBeginThread(RUNTIME_CLASS(CUIThread)); Sleep(500);
m_pCalculateThread->PostThreadMessage(WM_CALC,0,NULL);
該執行緒執行完訊息回應函式后
BEGIN_MESSAGE_MAP(CUIThread, CWinThread)
ON_THREAD_MESSAGE(WM_CALC,CUIThread::OnCalcaulate)
END_MESSAGE_MAP()
void CUIThread::OnCalcaulate(UINT wParam,LONG lParam)
{
Sleep(500);
::AfxMessageBox(L"THREAD_WM_CALC");
::PostMessage((HWND)(GetMainWnd()->GetSafeHwnd()),WM_DISPLAY,0,NULL);
}
發送結果資訊給主執行緒
ON_MESSAGE(WM_DISPLAY,&CMFCMTTESTDlg::OnDisplay)
LRESULT CMFCMTTESTDlg::OnDisplay(UINT wParam,LONG lParam)
{
::AfxMessageBox(L"MAIN_DLG_THREAD_WM_DISPLAY");
return 0;
}
uj5u.com熱心網友回復:

點擊OK 訊息回傳
uj5u.com熱心網友回復:
我程式里沒有視窗,主執行緒如何知道它何時收到子執行緒發送的訊息?不能回圈等待。求助求助uj5u.com熱心網友回復:
樓主 是不是把問題想的太復雜了要不用 回呼函式 試試?
或者 增加一個執行緒
uj5u.com熱心網友回復:
最后什么結果?uj5u.com熱心網友回復:
訊息通知即可uj5u.com熱心網友回復:
Multiple Threads in the User Interface http://msdn.microsoft.com/zh-cn/library/ms810439.aspx轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/133318.html
標籤:進程/線程/DLL
上一篇:關于邊界存盤型別問題
