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(句柄无效)
在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(句柄无效)
不要在InitInstance启动
------------------------------------------------------------
------------------------------------------------------------
严重同意,这种编程方法不是好习惯,不过如果是测试的话没有问题,呵呵。
在你的线程刚启动,就很快结束了,你再快按钮等待的也已经是一个已经退出的线程,线程句柄当然会无效的
-----------------------------------------------------
不同意,线程返回,其实线程内核对象还是存在的,只是计数减一,而且是处于受信状态,是能等到的,除非你CloseHandle.
楼主的问题是因为多线程的执行的顺序问题,你开始只等待了5000毫秒,这时也许你的线程还没执行完呢。
FREE指针后,记得设置为NULL