来看看----(一个简单的线程问题)

tiancanshi 2002-08-12 07:28:18
小弟初学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操作的继续执行,这样就不必考虑线程终止的问题。
用哪中方法更高效呢?
...全文
41 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
tiancanshi 2002-08-13
  • 打赏
  • 举报
回复
拜托,各位老兄,这个问题真的这么简单吗?没有人“会”答?
tiancanshi 2002-08-13
  • 打赏
  • 举报
回复
我自己已经解决了。
把创建事件也应该放到startping()中就可以啦,并且两个事件都不可少!
tiancanshi 2002-08-12
  • 打赏
  • 举报
回复
wanglei888(阿笨猫) 老兄:
你的方法经测试,行不通啊。把m_hSignalEvent = CreateEvent(NULL,FALSE,FALSE,NULL);取消以后,程序连Ping都不执行。
加上后,按你的意思把创建线程从初始化改到Ping操作中,还是和原来同样的毛病。

Crob(我干嘛这么帅~~~) :
我明白你的意思,但是现在遇到了这个线程问题,想弄个明白。如上1,2所问。

Crob 2002-08-12
  • 打赏
  • 举报
回复
不建议使用TerminateThread
MSDN中也这样说,这是不安全的做法

照你说的第三种最好了,让线程自然结束。
wanglei888 2002-08-12
  • 打赏
  • 举报
回复
我想原因可能是这样的:你的Stop按钮中用了TerminateThread(),这样线程就结束了,而你的Ping按钮的StartPing中又没有再次创建,所以就出现了你说的情况。

建议这样改:
CPingThread::CPingThread()
{
// 构造函数不创建线程
m_dwID = 0;
m_hThread = NULL;
m_hKillEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
// 不再使用
//m_hSignalEvent = CreateEvent(NULL,FALSE,FALSE,NULL);S
}

CPingThread::StartPing()
{
//
m_hThread = CreateThread(NULL,0,ThreadProc,this, 0, &m_dwID);
}

CPingThread::StopPing()
{
SetEvent(m_hKillEvent);
if (m_hThread != NULL) {
if (WAIT_TIMEOUT == WaitForSingleObject(m_hThread, 1000))
TerminateThread(m_hThred, -1);
CloseHandle(m_hThread);
m_hThread = NULL;
}
}

//在Stop按钮中调用CPingThread的StopPing函数

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧