为什么 辅线程sleep,主线程死?

ocean1004 2011-11-01 02:22:47
精简的程序是这样:

主对话框的BTN点击之后创建了一个辅线程,辅线程里创建一个对话框和两个BTN,然后辅助线程
while(1)
{
if(bshow)
dlg.show();
else
dlg.hide();
sleep(1000);
}


运行之后,主对话框会死。而且CPU占用率0%。暂停程序,程序停在辅线程的sleep里。

大概问题是出在辅助线程不能操作UI。UI是非线程安全的。有什么书详细描述UI非线程安全的吗?介绍本看看。
...全文
119 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2011-11-30
  • 打赏
  • 举报
回复
您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知

见此回复三日内无回应
我们将强制结帖
相关规定详见界面界面版关于版主结帖工作的具体办法
宇影周邵 2011-11-01
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 oyljerry 的回复:]

那就别把UI 放到工作线程中去.或者使用UI 线程来操作对话框
[/Quote]

这个是主要问题
kyotrue 2011-11-01
  • 打赏
  • 举报
回复
工作线程创建界面我试过,没有问题的,看看你是不是主线程在等辅助线程句柄,或者是不是主线程建的模态对话框,而你以为是工作线程的
oyljerry 2011-11-01
  • 打赏
  • 举报
回复
那就别把UI 放到工作线程中去.或者使用UI 线程来操作对话框
用户 昵称 2011-11-01
  • 打赏
  • 举报
回复
void
doevents( void )
{
MSG msg;

if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
}

void
delay( DWORD times )
{
DWORD dwStart = GetTickCount();
DWORD dwEnd = dwStart;
do
{
doevents();
dwEnd = GetTickCount();
} while( ( dwEnd - dwStart ) <= times );
}

用用俺常用的delay( 1000 );试试
用户 昵称 2011-11-01
  • 打赏
  • 举报
回复
嗯,俺也这么认为,俺线程里面Wait或Sleep的地方很多,从来没憋住过主线程。

您这精简的程序,不能说明问题所在。

15,979

社区成员

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

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