为什么我在线程中创建一个对话框却没响应呢?

sct 2005-10-06 12:07:22
一个网络程序,
我在主程序中开启消息接收线程,

消息接收线程函数
{
for(;;)
{
接收消息;
处理消息;
}
}

处理消息函数
{
打开一个与消息发送者联系的对话框(如果未存在),
将消息显示在对话框上;
}

但是每当接收到消息的时候,窗口是打开了,但是除了标题栏之外都是白白的一片,
用鼠标在上面点一下,主程序窗口和新打开的窗口就都没响应了,
为什么会这样呢?该怎么处理呢?请各位大虾多多指点,谢谢!


...全文
197 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
legendhui 2005-10-09
  • 打赏
  • 举报
回复
A退出,窗口已经不存在,你用的指针当然也不在了,不报错才怪
alen_ghl 2005-10-09
  • 打赏
  • 举报
回复
加上Sleep()看看
sct 2005-10-09
  • 打赏
  • 举报
回复
?
sct 2005-10-09
  • 打赏
  • 举报
回复
问题是窗口指针并不是在线程A中创建的啊,是在主程序中创建的,
退出线程A后窗口指针应该还有效啊
sct 2005-10-08
  • 打赏
  • 举报
回复
但是有一问题不解,为什么我在线程A中用一个全局的窗口指针作为参数调用子线程a时,如果A先退出,则a在用到窗口指针时就会报错,作为参数传递的窗口指针是全局的啊?

线程A
{
调用线程a(全局的窗口指针做参数);
//AfxMessageBox("wait"); //如果不加这一行的话就报错
}
qrlvls 2005-10-08
  • 打赏
  • 举报
回复
一般情况下最好在主线程中创建,通过同步方法来处理相关工作
在工作线程中完成会较复杂
sct 2005-10-08
  • 打赏
  • 举报
回复
多谢各位,我之前用了一个解决办法,给主线程发消息,在主线程中创建窗口,
Featured 2005-10-08
  • 打赏
  • 举报
回复
sorry,对不起。我更正一下:
是可以在工作线程中弹出对话框的,但是需要给它加上消息循环,方法如下:


CDlgAnother* p_dlg;//“请稍候……”对话框

UINT ShowThread(void * pParam)
{

p_dlg=new CDlgAnother;
p_dlg->Create(IDD_DIALOG1,NULL);
p_dlg->ShowWindow(SW_SHOW);

MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}

return 0;

}


void CThreadWindowDlg::OnButton1()
{
AfxBeginThread( ShowThread, NULL);
}
测试通过,能够正常相应消息循环

感谢 ookook(黑暗之光) 的指点。谢谢

GrassJing526(人) 也不用恨我了
sct 2005-10-07
  • 打赏
  • 举报
回复
help me please
ookook 2005-10-07
  • 打赏
  • 举报
回复
可以开,在工作线程中使用
DWORD WINAPI ThreadProc(LPVOID)
{
while(GetMessage(...)
{
TranslateMessage(...);
DispatchMessage(...);
}
return 0;
}
窗口资源是属于线程的,线程退出了,窗口资源就被操作系统释放了,所以如果仅创建就会发现窗口一闪就没了。
GrassJing526 2005-10-07
  • 打赏
  • 举报
回复
i hate you
Featured 2005-10-06
  • 打赏
  • 举报
回复
其实准确地说是:创建了也没法响应消息,窗体上控件也不可见

分析如下:
CDlgAnother* p_dlg;

UINT ShowThread(void * pParam)
{

p_dlg=new CDlgAnother;
p_dlg->Create(IDD_DIALOG1,NULL);
p_dlg->ShowWindow(SW_SHOW);
return 0;
}
如果这样子的话,此线程很快执行并结束,窗体就一闪而过。
怎么办?你可以Sleep,可以WaitForSingleObject,比如:
CDlgAnother* p_dlg;//“请稍候……”对话框
HANDLE h_go;
UINT ShowThread(void * pParam)
{

p_dlg=new CDlgAnother;
p_dlg->Create(IDD_DIALOG1,NULL);
p_dlg->ShowWindow(SW_SHOW);
WaitForSingleObject(h_go,5000);
return 0;

}

void CThreadWindowDlg::OnButton1()
{
h_go=CreateEvent(NULL,FALSE,FALSE,"Temp");

AfxBeginThread( ShowThread, NULL);

}
但是对于此线程而言,这些语句都会阻塞。
所以,是不可实现的。
Featured 2005-10-06
  • 打赏
  • 举报
回复
在工作线程中不能创建窗口的,否则无法相应消息的
MITSMI 2005-10-06
  • 打赏
  • 举报
回复
系统忙吧
消息发送后就忙着处理别的东西了吧,没有给消息处理足够的时间?
sct 2005-10-06
  • 打赏
  • 举报
回复
应该有办法的吧,
help
sct 2005-10-06
  • 打赏
  • 举报
回复

那要达到我要的效果该怎么做呢?

15,467

社区成员

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

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