来看看----(一个简单的线程问题)
小弟初学VC,在处理一个线程问题时,遇到了麻烦,烦劳各位指点!
下面是Pingthread.cpp中的内容
CPingThread::CPingThread()
{
m_dwID = 0;
m_hThread = NULL;
m_hKillEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
m_hSignalEvent = CreateEvent(NULL,FALSE,FALSE,NULL);
m_hThread = (HANDLE) _beginthreadex(NULL, 0, ThreadProc, (void*) this,
0, &m_dwID);
}
CPingThread::~CPingThread()
{
SetEvent(m_hKillEvent);
WaitForSingleObject(m_hThread,INFINITE);
}
UINT CPingThread::ThreadProc(void* lpParam)
{
CPingThread* pThis = reinterpret_cast<CPingThread*>(lpParam);
while (1)
{
HANDLE hObjects[2];
hObjects[0] = pThis->m_hKillEvent;
hObjects[1] = pThis->m_hSignalEvent;
DWORD dwWait = WaitForMultipleObjects(2,hObjects,FALSE,INFINITE);
if (dwWait == WAIT_OBJECT_0)
break;
if (dwWait == WAIT_OBJECT_0 + 1)
pThis->m_ping.Ping(pThis->m_nRetries,pThis->m_strHost, pThis->m_hWnd);
}
return 0;
}
void CPingThread::StartPing(UINT nRetries,CString strHost, HWND hWnd)
{
m_nRetries = nRetries;
m_strHost = strHost;
m_hWnd = hWnd;
SetEvent(m_hSignalEvent);
}
通过点击对话框上的Ping(BUTTON)触发事件,调用该类的StartPing,然后执行另一个
类中的Ping函数,Ping一台目的主机。(从上面可以看出)
现在如果在PING执行过程中,点击Stop(BUTTON),终止Ping操作
在其事件处理程序中加入:
::GetExitCodeThread(this->m_pingThread.m_hThread,&dExitcode);
::TerminateThread(this->m_pingThread.m_hThread,dExitcode);
能够终止进程,但是当我再点击Ping的时候(Ping另一台主机),程序就不会执行了。
到断点SetEvent(m_hSignalEvent)时就没有响应了。
1、这是怎么回事呢?
2、我该怎么解决这个问题。
3、还有一种方法就是我在Ping函数中设置一个BOOL变量,判断如果是Stop就
return,停止的Ping操作的继续执行,这样就不必考虑线程终止的问题。
用哪中方法更高效呢?