以CWinThread类为基类建立CGUIThread类
在Inistance函数中添加如下代码
CWnd* pWnd=new CWnd();
pWnd->CreateEx(0,
AfxRegisterWndClass( CS_HREDRAW|CS_VREDRAW|CS_BYTEALIGNCLIENT,0,(H
BRUSH)m_Brush) ,
"gui thread window",
WS_OVERLAPPEDWINDOW|WS_VISIBLE|WS_POPUP|WS_BORDER|WS_SYSMENU,
CRect(0,0,100,100),
NULL,
0);
m_pMainWnd=pWnd;
想问的是:
如果要对这个线程发送消息,是使用PostThreadMessage()发送给m_Thread(CGUIThread m
_Thread;),还是PostMessage()发送给m_pMainWnd?
如果PostThreadMessage可行,创建m_pMainWnd还有什么用呢?真诚请教!!!!
在Inistance函数中添加如下代码
CWnd* pWnd=new CWnd();
pWnd->CreateEx(0,
AfxRegisterWndClass( CS_HREDRAW|CS_VREDRAW|CS_BYTEALIGNCLIENT,0,(H
BRUSH)m_Brush) ,
"gui thread window",
WS_OVERLAPPEDWINDOW|WS_VISIBLE|WS_POPUP|WS_BORDER|WS_SYSMENU,
CRect(0,0,100,100),
NULL,
0);
m_pMainWnd=pWnd;
想问的是:
如果要对这个线程发送消息,是使用PostThreadMessage()发送给m_Thread(CGUIThread m
_Thread;),还是PostMessage()发送给m_pMainWnd?
如果PostThreadMessage可行,创建m_pMainWnd还有什么用呢?真诚请教!!!!
向CGUIThread类发送消息,不管是PostMessage还是PostThreadMessage,不要求每个消息得到顺序执行,但是要求所有的消息都要执行。也就是说,发送10遍消息,就要执行10遍相应的消息处理代码!!
多谢关注!!
只是用PostThreadMessage的话,你的消息处理函数必须在消息循环那里处理.因为用这个函数发的消息没有hwnd,不可能被调度到窗口函数那里再执行.所以你还是先问自己发消息是为了做什么,这些消息是想自己处理还是交给系统处理.
The thread to which the message is posted must have created a message queue, or else the call to PostThreadMessage fails. Use one of the following methods to handle this situation: Call PostThreadMessage. If it fails, call the Sleep function and call PostThreadMessage again. Repeat until PostThreadMessage succeeds.
究竟该怎么做,还是象_foo所说的,先问自己发消息是为了做什么,这些消息是想自己处理还是交给系统处理.
PostThreadMessage和PostMessage有什么不一样的地方吗?建立并启动一个UI线程,在Inistance函数中建立自己的窗口
CWnd* pWnd=new CWnd();
pWnd->CreateEx(0,
AfxRegisterWndClass( CS_HREDRAW|CS_VREDRAW|CS_BYTEALIGNCLIENT,0, (HBRUSH)m_Brush) ,
"DEMO THREAD WINDOW",
WS_OVERLAPPEDWINDOW|WS_VISIBLE|WS_POPUP|WS_BORDER|WS_SYSMENU,
CRect(100,100,200,200),
NULL,
0);
m_pMainWnd=pWnd;在主对话框程序的一个按钮点击响应函数中添加代码:
向这个UI线程使用PostThreadMessage连续发送10次消息,消息处理函数的内容是
弹出一个Message对话框,按确定退出!
结果UI线程的窗口上出现一个MB_OK类型的Message对话框!
如果我现在改变主对话框程序按钮点击响应函数的代码改为发送次数一次,其他不变.然后把UI线程消息处理函数的内容改成向主对话框使用PostMessage连续发送10次消息,消息处理函数的内容和UI线程一样,都是弹出一个Message对话框(MessageBox(hWnd,"content","caption",MB_OK)!!),结果主对话框上出现10个MB_OK类型的Message对话框!实在不知道怎么回事啊!!
请教!
不是PostThreadMessage的错,
我把UI线程中消息处理函数代码由:
int Num=(int)wparam;
count++;
TRACE("\nDEMO::ncount=%d",count);
for(int i=0;i<10;i++)
{
dlg->PostMessage(WM_THREADMSS1,0,0);
MessageBox(m_pMainWnd->m_hWnd,"Num:%d","DEMOTHREAD",MB_OK);
}
return 0;换成 int Num=(int)wparam;
count++;
TRACE("\nDEMO::ncount=%d",count);
for(int i=0;i<10;i++)
{
dlg->PostMessage(WM_THREADMSS1,0,0);
MessageBox(AfxGetApp()->m_pMainWnd->m_hWnd,"Num:%d","DEMOTHREAD",MB_OK);
}
return 0;就会弹出10个的MB_OK形式MessageBox对话框,只不过位置在主对话框的位置上?!!!奇怪,难道UI线程的m_pMainWnd和主对话框的m_pMainWnd不一样吗?
求教!!!!!!
不是PostThreadMessage的错,
我把UI线程中消息处理函数代码由:
int Num=(int)wparam;
count++;
TRACE("\nDEMO::ncount=%d",count);
for(int i=0;i<10;i++)
{
dlg->PostMessage(WM_THREADMSS1,0,0);
MessageBox(m_pMainWnd->m_hWnd,"Num:%d","DEMOTHREAD",MB_OK);
}
return 0;换成 int Num=(int)wparam;
count++;
TRACE("\nDEMO::ncount=%d",count);
for(int i=0;i<10;i++)
{
dlg->PostMessage(WM_THREADMSS1,0,0);
MessageBox(AfxGetApp()->m_pMainWnd->m_hWnd,"Num:%d","DEMOTHREAD",MB_OK);
}
return 0;就会弹出10个的MB_OK形式MessageBox对话框,只不过位置在主对话框的位置上?!!!
~~~~~~~~~不对,好像还是不行啊!!
郁闷,有人知道这是为什么吗?
其实这个m_pMainWnd主窗口句柄嘛,
那句m_pMainWnd = pWnd;你不加程序也能正常运行,只是你在其他的地方就不能用m_pMainWnd了,你这样相当于给m_pMainWnd负值,没其它什么意思的
还想再问问:
为什么在Inistance中不建立窗口,线程对发送给它的消息就无动于衷啊?
在VCWizzard中不是已经建立了消息队列了吗?已经有了DECLARE_MESSAGE_MAP,和BEGIN_MESSAGE_MAP...了吗?
不解中....
如果不在Inistance中建立窗口,线程一起动就退出了,并不是发送消息没有响应!
还是不解啊!
请大侠们赐教!!!