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()了。

解决方案 »

  1.   

    没有线程同步,主线程和子线程同时操作m_Thread对象操作,我也不知道会发生什么意想不到的情况,反正这样写肯定会出问题的
      

  2.   

    还有按下onbutton,主线程会阻塞,对话框界面将不能响应,既控件不会更新数据
      

  3.   

    Sleep(1000);
    是整个对话框线程停止。
    再有你是2个线程不停的访问同一个类内成员,MFC有优先级的吧,优先主线程的消息响应,你代码本身就有问题,没人会在OnButton1()事件里写个死循环的
      

  4.   

    你用Sleep,UI线程都阻塞了
    怎么响应m_Thread.SetWindowText(WM_SETTEXT消息)
      

  5.   

    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))一直得不到返回,它不也被阻塞了吗你指望有什么效果?
      

  6.   

    还有你的m_Thread.SetWindowText(str.GetBuffer(0));
    用法也有问题为啥不直接m_Thread.SetWindowText(str);
    另外你用了GetBuffer,为什么不ReleaseBuffer
      

  7.   

    呵呵,问题太多了,
    lz先看windows核心编程,和win32多线程吧。
      

  8.   

    OnButton1后,就占用整个系统资源,除非此函数运行结束
    建议OnButton1做成线程
      

  9.   

    线程是共享系统资源的,SLEEP不是while(1),是发送一个睡眠消息。收到可以睡觉了当然去睡觉。。