vc6.0,win2000, 基于Dialog的工程
在APP的InitInstance函数里面开了个线程,
线程什么都不干,直接return 0, 线程函数是ThreadFun
开线程的代码如下:
   CWinThread* pThread = AfxBeginThread( ThreadFun, NULL );
   g_habc = pThread->m_hThread;
   //DWORD dwRtn =WaitForSingleObject ( g_habc, 5000 );
   //注释如果放出来,可以正确返回,dwRtn会等于 0。然后在对话框上加了个按钮,按钮响应函数:OnButton1(),就是去等这个
Handle,代码如下
CDlg::OnButton1()
{
   DWORD dwRtn =WaitForSingleObject ( g_habc, 5000 );
   if ( dwRtn == WAIT_FAILED )//----------此处设置了断点
   {
        AfxMessageBox("FAILED");
dwRtn = GetLastError();
   }
   if ( dwRtn == WAIT_OBJECT_0 )
AfxMessageBox("HELLO");
   else
   {
CString abc;
abc.Format( "Error:%d", dwRtn );
AfxMessageBox(abc);
   }
}现象:
Ctrl+F5 运行
   1. AfxMessageBox("FAILED")不显示,
      最后AfxMessage(abc),abc = 258 (即0x102)-------TimeOut了
   2. 偶尔会报 Hello,表示成功等到了线程结束,但是很少有!!!!!
F5 调试
   在 ThreadFun return 0 处添加断点,
   在if ( dwRtn == WAIT_FAILED )处添加断点
   执行到ThreadFun return 0 处,按F10,再按F5运行,主界面显示。
   再点击button1,程序到达断点处,dwRtn正好等于 WAIT_FAILED,
   再往下走,可以看到GetLastError的返回值为6(句柄无效)

解决方案 »

  1.   

    补充一下: g_habc是全局变量. 整个程序就这么简单,专门用来测试的
      

  2.   

    在你的线程刚启动,就很快结束了,你再快按钮等待的也已经是一个已经退出的线程,线程句柄当然会无效的你把启动线程的那段放到onbutton里面,即便是这样,也有可能在你wait之前,线程已经退出至于timeout,好像此时g_habc句柄已经无效了
      

  3.   

    没有什么问题呀,我刚测试完的.你的g_habc是全局变量是怎么定义的?
      

  4.   

    线程函数return后线程就结束了,线程函数没有这样写的,一般都是一个有条件的循环。
      

  5.   

    分别用 VS2005 + XP / VC6 + 2003 试过了至少 10 次, 每次都可以出现 Hello 消息框.
      

  6.   

    jacklzw88(不可爱咯) 
       不要在InitInstance启动
    ------------------------------------------------------------
    ------------------------------------------------------------
    严重同意,这种编程方法不是好习惯,不过如果是测试的话没有问题,呵呵。  
     
      

  7.   

    vieri_ch(尘雨-自在飞花轻似梦,无边丝雨细如愁) ( ) 信誉:99    Blog 
    在你的线程刚启动,就很快结束了,你再快按钮等待的也已经是一个已经退出的线程,线程句柄当然会无效的
    -----------------------------------------------------
    不同意,线程返回,其实线程内核对象还是存在的,只是计数减一,而且是处于受信状态,是能等到的,除非你CloseHandle.
    楼主的问题是因为多线程的执行的顺序问题,你开始只等待了5000毫秒,这时也许你的线程还没执行完呢。
      

  8.   

    动任何指针类之前,最好测试是否为NULL,
    FREE指针后,记得设置为NULL
      

  9.   

    5秒钟还没有执行完只有return 0语句的线程,难道线程根本就被主线程挂起或者堵塞,或是启动线程操作是按照挂起方式启动的,要么是CPU被完全占用了。连context switch都没法做,好像有点问题吧?当内核对象的句柄引用计数被减为0的时候,这个内核对象就会被系统释放掉,句柄也会指向无效句柄