主线程运行,子线程就挂起

cnchery 2011-04-15 04:11:21
void CGUIDlg::OnOK()
{
// TODO: Add extra validation here
m_pThread = AfxBeginThread(IniThread, this);

}
UINT CGUIDlg::IniThread(LPVOID pParam)
{
CGUIDlg* dlg = (CGUIDlg*)pParam;



dlg->WriteThread();
dlg->m_pThread = NULL;
AfxEndThread(0);


return 0;
}
int i=0;
void CGUIDlg::WriteThread()
{
CString str;

while (i<10000000)
{
str.Format("%d",i);
m_Thread.SetWindowText(str.GetBuffer(0));
i++;
}

}

void CGUIDlg::OnButton1()
{
// TODO: Add your control notification handler code here
CString str;
str.Format("%d",j);
while (j<10000000)
{
Sleep(1000);
m_Thread.SetWindowText(str.GetBuffer(0));
j++;
}
}
我先按OnOk,线程开启,控件更新数据,
一旦我按下onbutton,为什么子线程就停了,挂起状态。我中间已经sleep()了。

...全文
229 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
baoyz 2011-04-26
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 king_hhuang 的回复:]
void CGUIDlg::WriteThread()
{
CString str;

while (i<10000000)
{
str.Format("%d",i);
m_Thread.SetWindowText(str.GetBuffer(0));
i++;
}

}
你这句是要让谁执行的?其实就是让UI线程响应WM_SETTEXT,更新控件值
现在UI线程都被你的w……
[/Quote]


我也是这么想的。
afairycell 2011-04-22
  • 打赏
  • 举报
回复
线程是共享系统资源的,SLEEP不是while(1),是发送一个睡眠消息。收到可以睡觉了当然去睡觉。。
lijianli9 2011-04-19
  • 打赏
  • 举报
回复
呵呵,问题太多了,
lz先看windows核心编程,和win32多线程吧。
鄢老 2011-04-19
  • 打赏
  • 举报
回复
OnButton1后,就占用整个系统资源,除非此函数运行结束
建议OnButton1做成线程
King_hhuang 2011-04-18
  • 打赏
  • 举报
回复
还有你的m_Thread.SetWindowText(str.GetBuffer(0));
用法也有问题

为啥不直接m_Thread.SetWindowText(str);
另外你用了GetBuffer,为什么不ReleaseBuffer
King_hhuang 2011-04-18
  • 打赏
  • 举报
回复
void CGUIDlg::WriteThread()
{
CString str;

while (i<10000000)
{
str.Format("%d",i);
m_Thread.SetWindowText(str.GetBuffer(0));
i++;
}

}
你这句是要让谁执行的?其实就是让UI线程响应WM_SETTEXT,更新控件值
现在UI线程都被你的while循环和Sleep给阻塞死了,它怎么响应WM_SETTEXT

既然UI线程响应不了WM_SETTEXT,你的子线程在执行m_Thread.SetWindowText(str.GetBuffer(0))一直得不到返回,它不也被阻塞了吗

你指望有什么效果?
cnchery 2011-04-18
  • 打赏
  • 举报
回复
不是主线程响不响应的问题,是子线程停止了,子线程不执行了
King_hhuang 2011-04-18
  • 打赏
  • 举报
回复
你用Sleep,UI线程都阻塞了
怎么响应m_Thread.SetWindowText(WM_SETTEXT消息)
cnchery 2011-04-18
  • 打赏
  • 举报
回复
我主要是问子线程为什么也停止了?
mudunke775 2011-04-15
  • 打赏
  • 举报
回复
Sleep(1000);
是整个对话框线程停止。
再有你是2个线程不停的访问同一个类内成员,MFC有优先级的吧,优先主线程的消息响应,你代码本身就有问题,没人会在OnButton1()事件里写个死循环的
小马喝水 2011-04-15
  • 打赏
  • 举报
回复
还有按下onbutton,主线程会阻塞,对话框界面将不能响应,既控件不会更新数据
小马喝水 2011-04-15
  • 打赏
  • 举报
回复
没有线程同步,主线程和子线程同时操作m_Thread对象操作,我也不知道会发生什么意想不到的情况,反正这样写肯定会出问题的

15,471

社区成员

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

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