一个简单的问题:如何既能显示对话框,又能同时运行三个子线程?

sdhzzzzcd 2008-05-30 08:43:30
基于Dialog的程序,我用类似下面的方法创建了三个线程:

HANDLE pThreadCapPkt = ::CreateThread(NULL,
NULL,
(LPTHREAD_START_ROUTINE)Init,
this,
CREATE_SUSPENDED,
NULL);
::SetThreadPriority(pThreadCapPkt,THREAD_BASE_PRIORITY_MAX);
::ResumeThread(pThreadCapPkt);

然后在CCapDataServerApp::InitInstance()中添加

HANDLE hdl[3] = {g_ConnectComm.pThreadRecvTcp, g_ConnectComm.pThreadSendTcp, pThreadCapPkt};
WaitForMultipleObjects(3, hdl, TRUE, INFINITE);
CCapDataServerDlg dlg;
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
// TODO: 在此放置处理何时用“确定”来关闭
//对话框的代码
}


在调试时根本走不到dlg.DoModal();这条语句,也就是无法显示对话框。
请问如何才能既能显示对话框,又能同时运行三个子线程?
以上的代码为什么无法显示对话框?
谢谢!
...全文
67 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
ookook 2008-05-30
  • 打赏
  • 举报
回复
HANDLE hdl[3] = {g_ConnectComm.pThreadRecvTcp, g_ConnectComm.pThreadSendTcp, pThreadCapPkt};
CCapDataServerDlg dlg;
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
// TODO: 在此放置处理何时用“确定”来关闭
//对话框的代码
}


//把这句放下面
WaitForMultipleObjects(3, hdl, TRUE, INFINITE);
cnzdgs 2008-05-30
  • 打赏
  • 举报
回复
如果要你等待线程结束才需要WaitForMultipleObjects,想同时运行就把WaitForMultipleObjects删掉。
jameshooo 2008-05-30
  • 打赏
  • 举报
回复
WaitForMultipleObjects已经导致线程完全阻塞了,必须等待3个线程全部关闭了才能继续执行后面的语句。
应该在3个子线程结束时向主线程的对话框窗口发送自定义消息来通知自己已结束,主线程不要调用WaitForMultipleObjects,直接打开对话框窗口就行了。

15,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧