用AfxBeginThread创建的线程,如何安全地终止?

时间:2021-12-24 23:54:58
创建线程的语句如下:
ServMainThread=AfxBeginThread(CCommunicatePlatform::ServMainThread,0);
由于在程序的运行过程中,有可能ServMainThread线程自己终止,或由别的什么异常原因终止,而在窗口关闭时,我又想要强行地终止ServMainThread线程,但如果这时ServMainThread线程已经终止,则调用:
TerminateThread(ServMainThread->m_hThread,0);//终止服务线程。
CloseHandle(ServMainThread->m_hThread);
就会出错,这相当于想去终止一个不存在的线程.
关键是:一个线程对象的指针,如何判断这个指针指的是一个可用的线程?还是一个已终止的线程?
我发现,当线程自己终止或别的原因终止时,ServMainThread并不会自动指向NULL.这就给判断一个线程是否终止带来了困难.

10 个解决方案

#1


不管你是用什么方法创建的线程,要想让他安全退出就得想办法让他自己返回,就是Return了。
GetExitCodeThread(ServMainThread->m_hThread,lpExitCode),判断一下lpExitCode的值就知道线程有没有结束了。

#2


GetExitCodeThread 判断线程是否还存在,

还是那句话,不建议 TerminateThread

#3


引用 1 楼 pzhfei 的回复:
不管你是用什么方法创建的线程,要想让他安全退出就得想办法让他自己返回,就是Return了。
GetExitCodeThread(ServMainThread->m_hThread,lpExitCode),判断一下lpExitCode的值就知道线程有没有结束了。

UP

#4


引用 1 楼 pzhfei 的回复:
不管你是用什么方法创建的线程,要想让他安全退出就得想办法让他自己返回,就是Return了。
GetExitCodeThread(ServMainThread->m_hThread,lpExitCode),判断一下lpExitCode的值就知道线程有没有结束了。

GetExitCodeThread 判断线程是否还存在,
不建议 TerminateThread
这两楼的合起来应当可以了

#5


不建议 TerminateThread,现在又要在线程外部终止线程,而线程本身又是阻塞在等待SOCKET连接上了,设置全局线程结束标志变量,也难啊.
还有什么好办法呢?

#6


APC 唤醒阻塞的线程?

#7


TerminateThread(ServMainThread->m_hThread,0);//终止服务线程。

不建议用TerminateThread,如果一定要强行终止,可以使用AfxEndThread()

#8


正常退出即可(return会自动调用AfxEndThread) TerminateThread就是不确保安全的

#9


使用ServMainThread=AfxBeginThread(CCommunicatePlatform::ServMainThread,0);

可以用AfxEndThread()结束线程,或者向子线程发送退出消息,友或者在线程的窗口中点击退出按钮。

#10


    判断ServMainThread是否为空,以及GetExitCodeThread(ServMainThread->m_hThread,lpExitCode)就可以判断线程的状态。然后通过与辅助线程通信(工作线程用全局变量或事件等,UI线程用PostThreadMessage(WM_QUIT))告诉线程退出,让线程自己返回。
    调用线程可以用WaitForSingleObject函数等待线程句柄,也可以让辅助线程在退出前最后一刻给调用线程(一般是主线程)发一条自定义消息“我返回了”,调用线程添加该消息的响应函数即可。后一种方法更好些,因为WaitForSingleObject会让主线程阻塞,这不太好。

#1


不管你是用什么方法创建的线程,要想让他安全退出就得想办法让他自己返回,就是Return了。
GetExitCodeThread(ServMainThread->m_hThread,lpExitCode),判断一下lpExitCode的值就知道线程有没有结束了。

#2


GetExitCodeThread 判断线程是否还存在,

还是那句话,不建议 TerminateThread

#3


引用 1 楼 pzhfei 的回复:
不管你是用什么方法创建的线程,要想让他安全退出就得想办法让他自己返回,就是Return了。
GetExitCodeThread(ServMainThread->m_hThread,lpExitCode),判断一下lpExitCode的值就知道线程有没有结束了。

UP

#4


引用 1 楼 pzhfei 的回复:
不管你是用什么方法创建的线程,要想让他安全退出就得想办法让他自己返回,就是Return了。
GetExitCodeThread(ServMainThread->m_hThread,lpExitCode),判断一下lpExitCode的值就知道线程有没有结束了。

GetExitCodeThread 判断线程是否还存在,
不建议 TerminateThread
这两楼的合起来应当可以了

#5


不建议 TerminateThread,现在又要在线程外部终止线程,而线程本身又是阻塞在等待SOCKET连接上了,设置全局线程结束标志变量,也难啊.
还有什么好办法呢?

#6


APC 唤醒阻塞的线程?

#7


TerminateThread(ServMainThread->m_hThread,0);//终止服务线程。

不建议用TerminateThread,如果一定要强行终止,可以使用AfxEndThread()

#8


正常退出即可(return会自动调用AfxEndThread) TerminateThread就是不确保安全的

#9


使用ServMainThread=AfxBeginThread(CCommunicatePlatform::ServMainThread,0);

可以用AfxEndThread()结束线程,或者向子线程发送退出消息,友或者在线程的窗口中点击退出按钮。

#10


    判断ServMainThread是否为空,以及GetExitCodeThread(ServMainThread->m_hThread,lpExitCode)就可以判断线程的状态。然后通过与辅助线程通信(工作线程用全局变量或事件等,UI线程用PostThreadMessage(WM_QUIT))告诉线程退出,让线程自己返回。
    调用线程可以用WaitForSingleObject函数等待线程句柄,也可以让辅助线程在退出前最后一刻给调用线程(一般是主线程)发一条自定义消息“我返回了”,调用线程添加该消息的响应函数即可。后一种方法更好些,因为WaitForSingleObject会让主线程阻塞,这不太好。