满分求解.关闭后主线程还在!!!

时间:2021-06-07 17:09:38
最近在做一个通讯项目。出现了没有想到的问题,关闭主窗体后进程还在任务管理器中,我知道是资源没有完全释放.我想知道有没有什么办法可以结束进程.?希望高人帮助,不胜感激.!

19 个解决方案

#1


ExitProcess
应该可以吧。

#2


ExitProcess

The ExitProcess function ends a process and all its threads.


void ExitProcess(
  UINT uExitCode
);

Parameters
uExitCode 
[in] Exit code for the process and all threads terminated as a result of this call. Use the GetExitCodeProcess function to retrieve the process's exit value. Use the GetExitCodeThread function to retrieve a thread's exit value. 
Return Values
This function does not return a value.

更详细的查MSDN吧。

#3


用TerminateThread()也不行么?

#4


有什么线程死锁了,没结束?

#5


ExitProcess

#6


一定是有工作(或界面)线程没结束, 主进程(线程)就结束, 导至...
试着在ExitInstance时候等待其它线程结束...

#7


最近在做一个通讯项目。出现了没有想到的问题,关闭主窗体后进程还在任务管理器中,我知道是资源没有完全释放.我想知道有没有什么办法可以结束进程.?希望高人帮助,不胜感激.!

赫赫,我前几天遇到了同样的问题,而且我的进程怎么也结束不掉,只能重新启动计算机。我是这么解决的,因为是多线程程序,一个线程等待接收命令,一个线程采集数据并发送,同时写sql server,我仔细检查了线程,发现是采集线程没有彻底退出,我在线程里加了若干检查退出判断就好了。
祝你顺利。

#8


楼上说的极是

#9


我想是因为我的CSOCKET结束程序后还有部分资源在使用,我使用了closesocket(m_sGate);但在后面如果再加上一句WSACleanup()则程序关闭时进程是销亡了.但程序报错.我试着删掉WSACleanup(),然后
void CTEXTDlg::OnClose() 
{
ExitProcess(0);--->加上这句.程序关闭时依然会报错。
CDialog::OnClose();

我没用过TerminateThread()不知道该怎么用。现在只能删除WSACleanup(),然后在任务管理器中强行关闭.不知道有什么办法可以解决啊?

#10


報什麼錯啊,樓主說得清楚一點.

#11


关注啊~~~~~~~~~~~~
我的也是主线程关闭在OnDestroy()里对退出线程的全局变量进行赋值,可是等到主线程都结束了,工作线程就不知道停到哪里了~~~~~~~
有这种情况发生时就出异常...
困扰我好久了!

#12


楼上,
   在OnDestroy()里对全局变量赋值(这个供退出的全局变量最好设置成 volatile 类型),然后检查 工作线程结束 后, 或等待一段时间后强制关闭工作线程(等待时间内检查是否结束),再退出。
   楼主参考。

#13


肯定是子线程还在运行,导致主界面关闭后,还在等待子线程结束或超时。

#14


一般来说主线程关闭后,子线程不也跟着退出吗?

#15


用TerminateThread()????????
应该在所有线程检测一个退出标志,当标志更改时退出,

#16


线程中一定要加入结束的标志。不控制线程的肯定不会自己退出。另外主窗口关闭了并不代表你的程序已经结束了,如果程序结束,不会留下一个线程。

#17


在主线程结束时通知工作线程让他自己退出。

#18


WaitForSingleObject(线程句柄,,时间)这个函数好像是这样

#19


主线程要等待所有的工作线程结束后,再Terminate.

#1


ExitProcess
应该可以吧。

#2


ExitProcess

The ExitProcess function ends a process and all its threads.


void ExitProcess(
  UINT uExitCode
);

Parameters
uExitCode 
[in] Exit code for the process and all threads terminated as a result of this call. Use the GetExitCodeProcess function to retrieve the process's exit value. Use the GetExitCodeThread function to retrieve a thread's exit value. 
Return Values
This function does not return a value.

更详细的查MSDN吧。

#3


用TerminateThread()也不行么?

#4


有什么线程死锁了,没结束?

#5


ExitProcess

#6


一定是有工作(或界面)线程没结束, 主进程(线程)就结束, 导至...
试着在ExitInstance时候等待其它线程结束...

#7


最近在做一个通讯项目。出现了没有想到的问题,关闭主窗体后进程还在任务管理器中,我知道是资源没有完全释放.我想知道有没有什么办法可以结束进程.?希望高人帮助,不胜感激.!

赫赫,我前几天遇到了同样的问题,而且我的进程怎么也结束不掉,只能重新启动计算机。我是这么解决的,因为是多线程程序,一个线程等待接收命令,一个线程采集数据并发送,同时写sql server,我仔细检查了线程,发现是采集线程没有彻底退出,我在线程里加了若干检查退出判断就好了。
祝你顺利。

#8


楼上说的极是

#9


我想是因为我的CSOCKET结束程序后还有部分资源在使用,我使用了closesocket(m_sGate);但在后面如果再加上一句WSACleanup()则程序关闭时进程是销亡了.但程序报错.我试着删掉WSACleanup(),然后
void CTEXTDlg::OnClose() 
{
ExitProcess(0);--->加上这句.程序关闭时依然会报错。
CDialog::OnClose();

我没用过TerminateThread()不知道该怎么用。现在只能删除WSACleanup(),然后在任务管理器中强行关闭.不知道有什么办法可以解决啊?

#10


報什麼錯啊,樓主說得清楚一點.

#11


关注啊~~~~~~~~~~~~
我的也是主线程关闭在OnDestroy()里对退出线程的全局变量进行赋值,可是等到主线程都结束了,工作线程就不知道停到哪里了~~~~~~~
有这种情况发生时就出异常...
困扰我好久了!

#12


楼上,
   在OnDestroy()里对全局变量赋值(这个供退出的全局变量最好设置成 volatile 类型),然后检查 工作线程结束 后, 或等待一段时间后强制关闭工作线程(等待时间内检查是否结束),再退出。
   楼主参考。

#13


肯定是子线程还在运行,导致主界面关闭后,还在等待子线程结束或超时。

#14


一般来说主线程关闭后,子线程不也跟着退出吗?

#15


用TerminateThread()????????
应该在所有线程检测一个退出标志,当标志更改时退出,

#16


线程中一定要加入结束的标志。不控制线程的肯定不会自己退出。另外主窗口关闭了并不代表你的程序已经结束了,如果程序结束,不会留下一个线程。

#17


在主线程结束时通知工作线程让他自己退出。

#18


WaitForSingleObject(线程句柄,,时间)这个函数好像是这样

#19


主线程要等待所有的工作线程结束后,再Terminate.

#20