程序关闭时,关闭线程

托管线程或者是后台线程,或者是前台线程。后台线程不会使托管执行环境处于活动状 态,除此之外,后台线程与前台线程是一样的。一旦所有前台线程在托管进程(其中 .exe 文件是托管程序集)中被停止,系统将停止所有后台线程并关闭。通过设置 Thread.IsBackground 属性,可以将一个线程指定为后台线程或前台线程。例如,通过将 Thread.IsBackground 设置为 true,就可以将线程指定为后台线程。同样,通过将 IsBackground 设置为 false,就可以将线程指定为前台线程。从非托管代码进入托管执行环境的所有线程都被标记为后台线程。通过创建并启动新的 Thread 对象而生成的所有线程都是前台线程。如果要创建希望用来侦听某些活动(如套接字连接)的前台线程,则应将 Thread.IsBackground 设置为 true,以便进程可以终止。

        一个线程或者是后台线程或者是前台线程。后台线程与前台线程类似,区别是后台线程不会阻止进程终止。一旦属于某一进程的所有前台线程都终止,公共语言运行 库就会通过对任何仍然处于活动状态的后台线程调用 Abort 来结束该进程。

.Net的公用语言运 行时(Common Language Runtime,CLR)能区分两种不同类型的线程:前台线程和后台线程。这两者的区别就是:应用程序必须运行完所有的前台线程才可以退出;而对于后台线 程,应用程序则可以不考虑其是否已经运行完毕而直接退出,所有的后台线程在应用程序退出时都会自动结束。


在Form_Closing事件中调用StopProcess(string processName)


/// <summary>
/// 停止进程
/// </summary>
/// <param name="processName">进程名称</param>
public static void StopProcess(string processName)
{
try
{
System.Diagnostics.Process[] ps = System.Diagnostics.Process.GetProcessesByName(processName);
foreach(System.Diagnostics.Process p in ps)
{
p.Kill();
}
}
catch(Exception ex)
{
throw ex;
}
}

这个进程名,就是你的可执行文件的文件名,如 abc.exe

在C++中,当程序被强制关闭(如通过信号或操作系统终止进程),需要采取一些措施来确保线程能被正确关闭。以下是几种常见的实现方法: #### 使用信号处理 在Unix/Linux系统中,可以利用信号处理机制来捕获程序关闭信号(如`SIGINT`、`SIGTERM`),并在信号处理函数中通知线程停止工作。 ```cpp #include <iostream> #include <thread> #include <atomic> #include <csignal> std::atomic<bool> stopFlag(false); void signalHandler(int signum) { stopFlag = true; } void threadFunction() { while (!stopFlag) { // 线程的工作逻辑 std::cout << "Thread is working..." << std::endl; std::this_thread::sleep_for(std::chrono::seconds(1)); } std::cout << "Thread is stopping..." << std::endl; } int main() { // 注册信号处理函数 std::signal(SIGINT, signalHandler); std::signal(SIGTERM, signalHandler); std::thread t(threadFunction); // 等待线程结束 t.join(); return 0; } ``` #### 使用Windows的异常处理 在Windows系统中,可以使用结构化异常处理来捕获程序关闭事件。 ```cpp #include <iostream> #include <thread> #include <atomic> #include <windows.h> std::atomic<bool> stopFlag(false); void threadFunction() { while (!stopFlag) { // 线程的工作逻辑 std::cout << "Thread is working..." << std::endl; std::this_thread::sleep_for(std::chrono::seconds(1)); } std::cout << "Thread is stopping..." << std::endl; } BOOL WINAPI ConsoleHandler(DWORD dwCtrlType) { if (dwCtrlType == CTRL_C_EVENT || dwCtrlType == CTRL_BREAK_EVENT || dwCtrlType == CTRL_CLOSE_EVENT) { stopFlag = true; return TRUE; } return FALSE; } int main() { // 注册控制台事件处理函数 SetConsoleCtrlHandler(ConsoleHandler, TRUE); std::thread t(threadFunction); // 等待线程结束 t.join(); return 0; } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值