使用另一个线程停止一个线程的工作

2023-12-08

不确定我的标题是否措辞得当,但无论如何:)

我有两个线程:包含需要完成的工作的主线程,以及包含带有进度条和取消按钮的表单的工作线程。在正常代码中,情况正好相反,但在这种情况下我不能这样做。

当用户单击取消按钮时,会显示一条提示,询问他是否真的要取消该工作。问题是工作在主线程上继续进行。我可以让主线程停止工作等,但我希望当他在提示上单击“是”时它停止工作。

Example:

// Main thread work starts here    
    t1 = new Thread(new ThreadStart(progressForm_Start));
    t1.Start();

    // Working
    for (i = 0; i <= 10000; i++)
    {
        semaphore.WaitOne();
        if (pBar.Running)
            bgworker_ProgressChanged(i);
        semaphore.Release();
        if (pBar.IsCancelled) break; 
    }

    t1.Abort(); 
// Main thread work ends here

// Start progress bar form in another thread
void progressForm_Start()
{
    pBar.Status("Starting");
    pBar.ShowDialog();
}

理论上我可以在 cancelWatch() 函数中包含一个提示,但随后我必须在实现此类的所有地方都这样做。


我有几个简短的评论:

  1. 避免使用Thread.Abort() 这就是为什么.
  2. 让你的线程成为后台线程:Thread.IsBackground = true(当您的应用程序退出时,这将自动退出线程)。

这里有一个关于如何进行的详细讨论safely停止线程运行:在 C# 中使用布尔标志来停止线程运行是否安全

要停止主线程上的工作,您必须执行以下操作:

boolean volatile isRunning = true;

static void Main(...)
{
    // ...
    // Working
    for (i = 0; i <= 10000; i++)
    {
        semaphore.WaitOne();
        if (!isRunning) break; // exit if not running
        if (pBar.Running)
            bgworker_ProgressChanged(i);
        semaphore.Release();
    }
    //...
    t1.Interrupt();// make the worker thread catch the exception
}
// 
void cancelButton_Click(object sender, EventArgs e)
{
    isRunning = false; // optimistic stop
    semaphore.Release();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用另一个线程停止一个线程的工作 的相关文章

  • IdentityServer 4 对它的工作原理感到困惑

    我阅读和观看了很多有关 Identity Server 4 的内容 但我仍然对它有点困惑 因为似乎有很多移动部件 我现在明白这是一个单独的项目 它处理用户身份验证 我仍然不明白的是用户如何注册它 谁存储用户名 密码 我打算进行此设置 Rea
  • 如何在C(Linux)中的while循环中准确地睡眠?

    在 C 代码 Linux 操作系统 中 我需要在 while 循环内准确地休眠 比如说 10000 微秒 1000 次 我尝试过usleep nanosleep select pselect和其他一些方法 但没有成功 一旦大约 50 次 它
  • 如何填充 ToolStripComboBox?

    我发现它很难将数据绑定到ToolStripComboBox 好像没有这个ValueMember and DisplayMember特性 怎么绑定呢 访问toolstripcombobox中包装的组合框并访问其ValueMember Disp
  • 函数参数的默认参数是否被视为该参数的初始值设定项?

    假设我有这样的函数声明 static const int R 0 static const int I 0 void f const int r R void g int i I 根据 dcl fct default 1 如果在参数声明中指
  • 从同一个类中的另一个构造函数调用构造函数

    我有一个带有两个构造函数的类 C 这是代码片段 public class FooBar public FooBar string s constructor 1 some functionality public FooBar int i
  • 查看 NuGet 包依赖关系层次结构

    有没有一种方法 文本或图形 来查看 NuGet 包之间的依赖关系层次结构 如果您使用的是新的 csproj 您可以在此处获取所有依赖项 在项目构建后 项目目录 obj project assets json
  • Visual Studio 在构建后显示假错误

    我使用的是 Visual Studio 2017 构建后 sln在调试模式下 我收到错误 但是 当我通过双击错误列表选项卡中的错误来访问错误时 错误会从页面中消失 并且错误数量也会减少 我不太确定这种行为以及为什么会发生这种情况 有超过 2
  • unordered_map 中字符串的 C++ 哈希函数

    看起来 C 标准库中没有字符串的哈希函数 这是真的 在任何 c 编译器上使用字符串作为 unordered map 中的键的工作示例是什么 C STL提供模板专业化 http en cppreference com w cpp string
  • 在Linux中,找不到框架“.NETFramework,Version=v4.5”的参考程序集

    我已经设置了 Visual studio 来在我的 Ubuntu 机器上编译 C 代码 我将工作区 我的代码加载到 VS 我可以看到以下错误 The reference assemblies for framework NETFramewo
  • 打破 ReadFile() 阻塞 - 命名管道 (Windows API)

    为了简化 这是一种命名管道服务器正在等待命名管道客户端写入管道的情况 使用 WriteFile 阻塞的 Windows API 是 ReadFile 服务器已创建启用阻塞的同步管道 无重叠 I O 客户端已连接 现在服务器正在等待一些数据
  • 如何在 Qt 应用程序中通过终端命令运行分离的应用程序?

    我想使用命令 cd opencv opencv 3 0 0 alpha samples cpp cpp example facedetect lena jpg 在 Qt 应用程序中按钮的 clicked 方法上运行 OpenCV 示例代码
  • 在视口中查找 WPF 控件

    Updated 这可能是一个简单或复杂的问题 但在 wpf 中 我有一个列表框 我用一个填充数据模板从列表中 有没有办法找出特定的数据模板项位于视口中 即我已滚动到其位置并且可以查看 目前我连接到了 listbox ScrollChange
  • 如何在 C 中安全地声明 16 位字符串文字?

    我知道已经有一个标准方法 前缀为L wchar t test literal L Test 问题是wchar t不保证是16位 但是对于我的项目 我需要16位wchar t 我还想避免通过的要求 fshort wchar 那么 C 不是 C
  • C++ int 前面加 0 会改变整个值

    我有一个非常奇怪的问题 如果我像这样声明一个 int int time 0110 然后将其显示到控制台返回的值为72 但是当我删除前面的 0 时int time 110 然后控制台显示110正如预期的那样 我想知道两件事 首先 为什么它在
  • C++ 中的双精度型数字

    尽管内部表示有 17 位 但 IEE754 64 位 浮点应该正确表示 15 位有效数字 有没有办法强制第 16 位和第 17 位为零 Ref http msdn microsoft com en us library system dou
  • 等待 IAsyncResult 函数直至完成

    我需要创建等待 IAsyncResult 方法完成的机制 我怎样才能做到这一点 IAsyncResult result contactGroupServices BeginDeleteContact contactToRemove Uri
  • 实体框架中的“it”是什么

    如果以前有人问过这个问题 请原谅我 但我的任何搜索中都没有出现 它 我有两个数据库表 Person 和 Employee 对每个类型的表进行建模 例如 Employee is a Person 在我的 edmx 设计器中 我定义了一个实体
  • 堆栈是向上增长还是向下增长?

    我在 C 中有这段代码 int q 10 int s 5 int a 3 printf Address of a d n int a printf Address of a 1 d n int a 1 printf Address of a
  • 不区分大小写的字符串比较 C++ [重复]

    这个问题在这里已经有答案了 我知道有一些方法可以进行忽略大小写的比较 其中涉及遍历字符串或一个good one https stackoverflow com questions 11635 case insensitive string
  • OpenCV SIFT 描述符关键点半径

    我正在深入研究OpenCV的SIFT描述符提取的实现 https github com Itseez opencv blob master modules nonfree src sift cpp 我发现了一些令人费解的代码来获取兴趣点邻域

随机推荐

  • 将经过训练的超正方文件合并为一个

    我在 Mac 上使用最新版本的 Tesseract 我在一个文件夹中有一个 eng traineddata 在另一个文件夹中有一个 eng traineddata 我希望将我的训练数据文件合并到一个大的训练字体文件中 谁能告诉我该怎么做 我
  • C# 中的骨架化 OpenCV

    任何人都可以给我一个例子 说明如何在不使用距离变换的情况下进行骨架化 或者如果您有使用距离跑步变换的骨架化 我有一个用 C 编写的 OpenCV 示例 更多不起作用 cvlib CvDistTransform pimg ref ref ti
  • 在 ListModel 中传递数组

    我想知道如何在 ListModel 中传递数组 好的 在 QML 中我有一个 ListView 我将其设置为ListModel像这样 model ListModel id myList ListElement name card 0 boo
  • pd.get_dummies() 在大级别上缓慢

    我不确定这是否已经是最快的方法 或者我是否这样做效率低下 我想对一个具有 27k 可能级别的特定分类列进行热编码 该列在 2 个不同的数据集中具有不同的值 因此我在使用 get dummies 之前首先组合了级别 def hot encod
  • 使用 ruby​​ 和 sinatra 保存循环构建的 html 文本中的所有用户条目

    我正在创建一个显示表格的网页 每条记录的末尾还有四列 它们是用户可以输入数据的文本字段 当用户点击底部的提交按钮时 我想保存所有文本字段中的所有数据并将其添加到我的表中 如何保存所有文本字段的数据 这是我的代码 h1 Testing Tab
  • 通过 Java 使用 REST API

    我有一个位于远程服务器上的管理 Web 应用程序 这个应用程序是使用 MEAN 堆栈编写的 我有一个连接到 Web 应用程序所需的所有 RESTful 路由的列表 我正在编写一个 Java 客户端应用程序 需要从此管理应用程序发送和接收数据
  • 如何覆盖 UISearchBar 中的取消按钮

    我目前正在使用以下方法来阻止取消按钮项目显示在搜索栏中 我有一个习惯UIButton我想用它来代替 问题是目前内置的取消按钮仍然显示 void searchDisplayControllerDidBeginSearch UISearchDi
  • 如何检查闹钟是否已设置并正在运行

    我有一个接收器 在手机启动后启动 如下所示
  • HttpConnection - javax.microedition,为 getLength() 方法返回 -1

    我正在尝试用 java 编写一个非常简单的移动应用程序 J2ME 这个想法是通过 URL 输入访问网站并将网站内容读入缓冲区 问题就在这里 这对某些 URL 来说效果很好 但对其他 URL 却不起作用 下面的例子 维基百科 工作正常 但是以
  • Java生成在2^48周期内不重复的“随机”数字

    基本上我想生成在很长一段时间内不会重复的随机数 我不想使用序列 例如java使用的LCG synchronized protected int next int bits seed seed 0x5DEECE66DL 0xBL 1L lt
  • 去掉中间的背景,只保留边框

    这可以做到吗 如何让背景中间完全透明 这将使中间部分透明 并且不会对其应用任何内容 https jsfiddle net racsob9v 现在看起来是这样的 我正在尝试这样做 html body height 100 padding 0
  • 当我的 ViewController 嵌入到 UINavigationController 中时,如何对值进行排序?

    我有两个视图控制器 它们通过 segues 来回发送值准备继续方法 这对我来说一直很完美 直到我决定将我的 ViewController 嵌入到导航控制器中 如果您查看下面的方法 您会发现问题是我的目的地视图控制器不再是 ViewContr
  • data.table 非等值连接中的意外行为

    这是后续this问题 其中接受的答案显示了使用匹配练习的示例data table 包括非平等条件 背景 基本设置是我们有DT1包含人员详细信息样本 以及DT2 这是一种主数据库 目的是找出每个人是否DT1匹配至少一项DT2 首先 我们初始化
  • tf.Estimator.train 抛出 as_list() 未在未知 TensorShape 上定义

    我创建了一个自定义input func并将 keras 模型转换为tf Estimator为了训练 但是 它一直给我带来错误 这是我的模型摘要 我试图设置Input层与batch shape 16 320 320 3 进行测试 但问题仍然存
  • “.addEventListener 不是函数”为什么会出现此错误?

    我收到 addEventListener 不是函数 错误 我被困在这一点上 var comment document getElementsByClassName button function showComment var place
  • 在一个 lambda 表达式中收集复杂对象

    我有一个对象列表 首先 我需要按类型对其进行排序 比按面值 最后 总结所有数量 class Coin String type BigInteger faceValue BigInteger quantity List
  • 使用元类模拟 Gradle project.exec {...}

    作为测试 Gradle 插件的一部分 我想删除一个 groovy 方法 project exec 这是为了确认它正在进行正确的命令行调用 我正在尝试使用元编程 Project proj ProjectBuilder builder buil
  • “java.io.StreamCorruptedException:无效类型代码:AC”-从服务器-客户端java程序运行客户端代码时发现错误[重复]

    这个问题在这里已经有答案了 好吧 我正在尝试从 XMLParser 读取 xml 文件 所以基本上我想读取 XML 文件并将其从服务器打印到客户端 但是在运行客户端代码时我得到 java io StreamCorruptedExceptio
  • 在 awk 中修剪字符串的前导和尾随空格

    我正在尝试删除下面第二列中的前导和尾随空格input txt Name Order Trim working cat cat1 我用过下面的awk删除第二列中的前导和尾随空格 但它不起作用 我缺少什么 awk F 2 2 1 input t
  • 使用另一个线程停止一个线程的工作

    不确定我的标题是否措辞得当 但无论如何 我有两个线程 包含需要完成的工作的主线程 以及包含带有进度条和取消按钮的表单的工作线程 在正常代码中 情况正好相反 但在这种情况下我不能这样做 当用户单击取消按钮时 会显示一条提示 询问他是否真的要取