如何正确的关闭线程

xharry 2004-06-21 09:24:16
我的一个程序中除主线程外,还有另外两个线程

其中一个用于和服务器端建立Socket连接,这个进程会在Socket收到数据的时候
更新CMainFrame中的一个CListCtrl,这样,如果正在更新的时候,CMainFrame突然
被关闭,由于进程间的不同步,可能会导致更新的CListCtrl已经不存在了,这样
就会报错。

还有一个线程,它会每隔一段时间休眠(Sleep)几秒钟。

那个带Socket连接的线程可能会因为等待Socket发来数据而阻塞,而另外一个会休眠

这样一来,如果在这两个线程中用信号量结束线程可能就会有问题,因为,线程需要等待一段时间才能检测到信号量的变化,这样就不能在关闭CMainFrame的同时,也
把两个子现程也结束。

如果直接CloseHandle(),则报错说:无效句柄
...全文
506 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
CsdnRob 2004-07-02
  • 打赏
  • 举报
回复
msconfig 看启动了那些不要的关掉(不能上网) 在dos下,删除这样的木马文件 运行spant.exe 将web重置 我这样弄过,可以成功的 好运!
gwwgww 2004-06-24
  • 打赏
  • 举报
回复
主线程退出时要等待工作线程退出:
WaitForMutiObject,等待的对象是两个工作线程的句柄。
hxzb7215191 2004-06-23
  • 打赏
  • 举报
回复
我有一个方法,你可以去试一下。
一般我们的socket是用的阻塞的方式。
可能你们的socket线程还有等待连入的时候,主进程退出来了。
这你就在主进程退出之前,向socket线程去连入一次。
在socket线程函数中,加一个条件退出就行了。

也不知道,你理解了没有 。

反正,我就是这样弄的。
ChangeMyHead 2004-06-23
  • 打赏
  • 举报
回复
CFile oFile( "C:\\Test.txt" , CFile::modeWrite );
HANDLE hReceiveThread;

DWORD WINAPI TestProc(LPVOID pParam){
while( 1 ){
oFile.Write( "FF" , 2 );
::Sleep( 100 );
}
//oFile.Close();
return 0;
}

void CZsdfgsdfgsdfgDlg::OnOK()
{
// TODO: Add extra validation here
unsigned long ThreadID;
hReceiveThread = NULL;

hReceiveThread = CreateThread( NULL , 0 , TestProc , this->m_hWnd , 0 , &ThreadID );
}

void CZsdfgsdfgsdfgDlg::OnEnd()
{
// TODO: Add your control notification handler code here
if( CloseHandle( hReceiveThread ) ){
MessageBox( "OK" );
delete hReceiveThread; //结束不了
}else{
MessageBox( "NOK" );
}
}
hopen 2004-06-23
  • 打赏
  • 举报
回复
先判断线程句柄是否是NULL,然后再
if (hThread != NULL)
CloseHandle(hThread);
xharry 2004-06-23
  • 打赏
  • 举报
回复
可我用CloseHandle()却报错说,无效句柄

郁闷,再等一天,没结果就结贴,多谢各位了
zhangnanonnet 2004-06-22
  • 打赏
  • 举报
回复
closehandle(线成句柄)
会思考的草 2004-06-22
  • 打赏
  • 举报
回复
让它自己关闭。
xharry 2004-06-21
  • 打赏
  • 举报
回复
我用的是
WaitForSingleObject(hDeadEvent,1);

因为这两个子线程可能会延时很久,所以,如果等的话,可能会很久,这样不好
enoloo 2004-06-21
  • 打赏
  • 举报
回复
主窗口等一下,等两个子线程结束了。
hahu 2004-06-21
  • 打赏
  • 举报
回复
由线程自己退出
1.先SetEvent(hKillEvent),WaitForSingleObject(hDeadEvent,INFINITE);
2.然后closesocket
3.这时候线程中监听socket的accept会返回INVALID_SOCKET
这个地方判断
if(WaitForSingleObject(hKillEvent, 0) != WAIT_TIMEOUT)
正常关闭,线程可以退出
SetEvent(hDeadEvent);
else
只是socket错误,线程还不能退出
4.主线程的WatiForSingleObject收到hDeadEvent事件
可以退出了
xharry 2004-06-21
  • 打赏
  • 举报
回复
TerminateThread,也会说Invalade Handle:(

15,472

社区成员

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

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