程序是这样的:
Start() ,启动一个线程
{
while(1)
{
执行其他代码 if (WaitForSingleObject(m_hKillEvent, 0) == WAIT_OBJECT_0)
break;
}
ResetEvent(KillEvent);}
Stop() 关闭线程
{
SetEvent(KillEvent);
While (WaitForSingleObject(m_hKillEvent, 0) == WAIT_OBJECT_0 )
Sleep(5);
}一个start按钮调用start(), 一个stop按钮调用stop(), 当不停地循环点击这两个按钮时,程序会没响应,鼠标变成漏斗形状。 这种情况只在很快的机器上发生, 在慢的机器上不会出现。
Start() ,启动一个线程
{
while(1)
{
执行其他代码 if (WaitForSingleObject(m_hKillEvent, 0) == WAIT_OBJECT_0)
break;
}
ResetEvent(KillEvent);}
Stop() 关闭线程
{
SetEvent(KillEvent);
While (WaitForSingleObject(m_hKillEvent, 0) == WAIT_OBJECT_0 )
Sleep(5);
}一个start按钮调用start(), 一个stop按钮调用stop(), 当不停地循环点击这两个按钮时,程序会没响应,鼠标变成漏斗形状。 这种情况只在很快的机器上发生, 在慢的机器上不会出现。
WAIT_OBJECT_0
死循环!!!!!
{
// m_hThread 在构造函数中赋NULL
if(m_hThread != NULL)
{
::WaitForSingleObject (m_hThread, INFINITE);
::CloseHandle (m_hThread);
m_hThread = NULL;
} CWinThread* pThread = AfxBeginThread (ThreadFunc, ptp,
THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED); ::DuplicateHandle (GetCurrentProcess (),
pThread->m_hThread, GetCurrentProcess (), &m_hThread,
0, FALSE, DUPLICATE_SAME_ACCESS); pThread->ResumeThread(); ……
}
而stop()只有在线程结束之后才会返回
Start() ,启动一个线程
{
while(1)
{
执行其他代码 if (WaitForSingleObject(m_hKillEvent, 0) == WAIT_OBJECT_0)
break;
}
ResetEvent(KillEvent);}
Stop() 关闭线程
{
SetEvent(KillEvent);
While (WaitForSingleObject(m_hKillEvent, 0) == WAIT_OBJECT_0 )
Sleep(5);
}怎么set的都是KillEvent,wait的都是m_hKillEvent。你要写的是这种吧Start() ,启动一个线程
{
while(1)
{
执行其他代码 if (WaitForSingleObject(m_hKillEvent, 0) == WAIT_OBJECT_0)
break;
}
SetEvent(KillEvent);}
Stop() 关闭线程
{
SetEvent(m_hKillEvent);
While (WaitForSingleObject(KillEvent, 0) == WAIT_OBJECT_0 )
Sleep(5);
}
::WaitForSingleObject (m_hThread, INFINITE);
::CloseHandle (m_hThread);
m_hThread = NULL;
//if (WaitForSingleObject(m_hKillEvent,INFINITE)==WATI_OBJECT_0)楼主用WaitForSingleObject(m_hKillEvent,0),那么Start里会直接跳过break。线程进入死循环。
同理,Stop中的WaitForSingleObject也用INFINITE。
Start()
{
while(1){
if (WaitForSingleObject(m_hKillEvent,INFINITE)==WAIT_OBJECT_0){ //此处等待事件
break;
...//线程执行代码
}
}
stop()
{
SetEvent(m_hKillEvent);
//不用再WaitForSingleObject 事件了吧。
WaitForSingleObject(m_hMyThread,INFINITE);
CloseHandle(m_hMyThread);
}
如果按你的说法,线程里只有在stop()被调用之后才会执行线程的代码,这样逻辑上是有问题的吧。