自己创建了一个线程,然后在该线程中使用了while循环,结果发现主窗体(用的是非模态对话框)没有反应了(无法移动,最大最小化,按钮也没法按),调试后才发现,程序一直卡在线程中的while循环,进不了GetMessage循环,有什么解决方法吗?
解决方案 »
- 动态为Datagrid控件提供数据源的问题
- 请问如何改变鼠标的形状。我调用SetCursor怎么不好用?
- 我想做个dll,可以被vc调用,也可以被delphi调用!但为什么当发布到另外的机器上报缺少很多的dll呢?如Mfc2D.dll
- ★★★★这样的模型会不会死锁,或者有没有更好的方法(模型)????★★★★
- 如何让应用程序的窗口在最大化后,其四边依然可见呀?
- 高分请教一个简单的问题
- 回复:关于nmake使用
- 帮帮忙!我都快急死了~~~~~~~~~~~~~~
- VC 如何定义一个类,可以处理消息,而且有 HWND 的?最好有 MFC 与 WTL 的方法?
- 如何修改不是本程序产生的系统托盘图标
- CStatic对象的定义
- m_rgn.CombineRgn总出错
两个线程序根本是两回事.
case WM_INITDIALOG:
hThread=CreateThread(NULL,0,ThreadProc,hDlg,CREATE_SUSPENDED,&dwThreadID);
return FALSE;
然后在对话框的按钮处理中恢复线程,ThreadProc部分如下
DWORD WINAPI ThreadProc(LPVOID param)
{ short ctlState;//ctrl键的状态
short altState;//alt键的状态
HDC hdc;//画布窗体设备上下文
short ctlState;//ctrl键的状态
short altState;//alt键的状态
HWND hDlgCanvas;//画布窗体句柄
HPEN hpn;//画笔 hDlgCanvas=CreateDialog(GetModuleHandle(NULL),MAKEINTRESOURCE(IDD_DLGCANVAS),hWnd,DlgCanvasProc);
hdc=GetDC(hDlgCanvas);
hpn=CreatePen(PS_SOLID,5,RGB(67,131,248));
SelectObject(hdc,hpn); while(TRUE)
{
ctlState=GetAsyncKeyState(VK_CONTROL);
altState=GetAsyncKeyState(VK_MENU); ShowWindow(hDlgCanvas,TRUE);
....其他处理
ShowWindow(hDlgCanvas,FALSE);
sleep(10);
}
return 0;
}
hdc=GetDC(hDlgCanvas);
hpn=CreatePen(PS_SOLID,5,RGB(67,131,248));
SelectObject(hdc,hpn)
注释掉就OK了,我的主窗体是非模态对话框。
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
需要修改,但不知道怎样改
{
switch(msg.hwnd){
case hwnd:
IsDialogMessage(hwnd, &msg);
break;
case DlgCanvas:
IsDialogMessage(DlgCanvas, &msg);
break;
}改成上面的试试.
{
if(msg.hwnd==hDlgMain)
IsDialogMessage(hDlgMain, &msg);
else if(msg.hwnd==hDlgCanvas)
IsDialogMessage(hDlgCanvas, &msg);
}
发现按钮无法点击了,于是改成了
while (GetMessage(&msg, NULL, 0, 0))
{
if(msg.hwnd==hDlgMain)
IsDialogMessage(hDlgMain, &msg);
else if(msg.hwnd==hDlgCanvas)
IsDialogMessage(hDlgCanvas, &msg);
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
} }
结果跟没改一样。主窗口还是没有响应
程序大么, 不大整个发出来.
while(TRUE)
{
while(PeekMessage(&Message,NULL,(UINT) 0,(UINT) 0,PM_REMOVE))
{
// Check for the WM_QUIT message if(Message.message == WM_QUIT)
{
return NOERROR;
} // Send the message to the window procedure TranslateMessage(&Message);
DispatchMessage(&Message);
}
ctlState=GetAsyncKeyState(VK_CONTROL);
altState=GetAsyncKeyState(VK_MENU); ShowWindow(hDlgCanvas,TRUE);
....其他处理
ShowWindow(hDlgCanvas,FALSE);
sleep(10);
}
{
if(PeekMessage(&msg,0,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
if(msg.message==IDCANCEL) // <---这里退出
break;
}
}
这样就可以相应退出的消息
{
if(Message.message == WM_QUIT)
{
return NOERROR;
}
TranslateMessage(&Message);
DispatchMessage(&Message);
}
我有个疑问,加入这段代码之后程序不就在PeekMessage中循环了吗,不会执行下面的语句了呀。
原因在于在线程中创建的窗体需要有自己的消息循环。最后在线程中的while循环最后添加了如下代码,
MSG msg;
PeekMessage(&msg,hDlgCanvas,NULL,NULL,PM_NOREMOVE);
TranslateMessage(&msg);
DispatchMessage(&msg);
不过总觉得不太妥当。
初学SDK,很多方面的知识还需要完善,我会继续努力的。感谢大家的热心回复!
第3个参数指定了父窗口HWND, 我以为消息都跑父窗口所属的线程了.
这个问题以前还真没注意过.