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的值就知道线程有没有结束了。
GetExitCodeThread(ServMainThread->m_hThread,lpExitCode),判断一下lpExitCode的值就知道线程有没有结束了。
#2
GetExitCodeThread 判断线程是否还存在,
还是那句话,不建议 TerminateThread
还是那句话,不建议 TerminateThread
#3
UP
#4
GetExitCodeThread 判断线程是否还存在,
不建议 TerminateThread
这两楼的合起来应当可以了
#5
不建议 TerminateThread,现在又要在线程外部终止线程,而线程本身又是阻塞在等待SOCKET连接上了,设置全局线程结束标志变量,也难啊.
还有什么好办法呢?
还有什么好办法呢?
#6
APC 唤醒阻塞的线程?
#7
TerminateThread(ServMainThread->m_hThread,0);//终止服务线程。
不建议用TerminateThread,如果一定要强行终止,可以使用AfxEndThread()
不建议用TerminateThread,如果一定要强行终止,可以使用AfxEndThread()
#8
正常退出即可(return会自动调用AfxEndThread) TerminateThread就是不确保安全的
#9
使用ServMainThread=AfxBeginThread(CCommunicatePlatform::ServMainThread,0);
可以用AfxEndThread()结束线程,或者向子线程发送退出消息,友或者在线程的窗口中点击退出按钮。
可以用AfxEndThread()结束线程,或者向子线程发送退出消息,友或者在线程的窗口中点击退出按钮。
#10
判断ServMainThread是否为空,以及GetExitCodeThread(ServMainThread->m_hThread,lpExitCode)就可以判断线程的状态。然后通过与辅助线程通信(工作线程用全局变量或事件等,UI线程用PostThreadMessage(WM_QUIT))告诉线程退出,让线程自己返回。
调用线程可以用WaitForSingleObject函数等待线程句柄,也可以让辅助线程在退出前最后一刻给调用线程(一般是主线程)发一条自定义消息“我返回了”,调用线程添加该消息的响应函数即可。后一种方法更好些,因为WaitForSingleObject会让主线程阻塞,这不太好。
调用线程可以用WaitForSingleObject函数等待线程句柄,也可以让辅助线程在退出前最后一刻给调用线程(一般是主线程)发一条自定义消息“我返回了”,调用线程添加该消息的响应函数即可。后一种方法更好些,因为WaitForSingleObject会让主线程阻塞,这不太好。
#1
不管你是用什么方法创建的线程,要想让他安全退出就得想办法让他自己返回,就是Return了。
GetExitCodeThread(ServMainThread->m_hThread,lpExitCode),判断一下lpExitCode的值就知道线程有没有结束了。
GetExitCodeThread(ServMainThread->m_hThread,lpExitCode),判断一下lpExitCode的值就知道线程有没有结束了。
#2
GetExitCodeThread 判断线程是否还存在,
还是那句话,不建议 TerminateThread
还是那句话,不建议 TerminateThread
#3
UP
#4
GetExitCodeThread 判断线程是否还存在,
不建议 TerminateThread
这两楼的合起来应当可以了
#5
不建议 TerminateThread,现在又要在线程外部终止线程,而线程本身又是阻塞在等待SOCKET连接上了,设置全局线程结束标志变量,也难啊.
还有什么好办法呢?
还有什么好办法呢?
#6
APC 唤醒阻塞的线程?
#7
TerminateThread(ServMainThread->m_hThread,0);//终止服务线程。
不建议用TerminateThread,如果一定要强行终止,可以使用AfxEndThread()
不建议用TerminateThread,如果一定要强行终止,可以使用AfxEndThread()
#8
正常退出即可(return会自动调用AfxEndThread) TerminateThread就是不确保安全的
#9
使用ServMainThread=AfxBeginThread(CCommunicatePlatform::ServMainThread,0);
可以用AfxEndThread()结束线程,或者向子线程发送退出消息,友或者在线程的窗口中点击退出按钮。
可以用AfxEndThread()结束线程,或者向子线程发送退出消息,友或者在线程的窗口中点击退出按钮。
#10
判断ServMainThread是否为空,以及GetExitCodeThread(ServMainThread->m_hThread,lpExitCode)就可以判断线程的状态。然后通过与辅助线程通信(工作线程用全局变量或事件等,UI线程用PostThreadMessage(WM_QUIT))告诉线程退出,让线程自己返回。
调用线程可以用WaitForSingleObject函数等待线程句柄,也可以让辅助线程在退出前最后一刻给调用线程(一般是主线程)发一条自定义消息“我返回了”,调用线程添加该消息的响应函数即可。后一种方法更好些,因为WaitForSingleObject会让主线程阻塞,这不太好。
调用线程可以用WaitForSingleObject函数等待线程句柄,也可以让辅助线程在退出前最后一刻给调用线程(一般是主线程)发一条自定义消息“我返回了”,调用线程添加该消息的响应函数即可。后一种方法更好些,因为WaitForSingleObject会让主线程阻塞,这不太好。