multithreading - 如何从另一个线程(Glib 线程)中取消一个线程?
问题描述
我正在使用 GTK 和 GLib 中的线程函数开发一个应用程序库。我有一个线程(从现在起将被称为线程 A),当我在某个图形窗口中单击“确定”按钮时创建该线程。线程 A 开始执行一些繁重的任务。另一个名为“取消”的按钮可用于随时停止和结束线程 A。
我的目标是为当我点击能够结束线程 A 的“取消”按钮(线程 B)时创建的线程编写一个函数。
我用函数创建线程g_thread_create
A。但是我找不到任何类似于g_thread_cancel
使用线程 B 停止线程 A 的函数。这可能还是不能完成?
非常感谢您提供的任何信息。
解决方案
您可能要考虑使用GTask
在线程中运行任务,而不是使用手动创建的线程。如果使用g_task_run_in_thread()
,该操作将自动在单独的线程中运行。
GTask
与 集成GCancellable
,因此要取消您将从g_cancellable_cancel()
“取消”按钮在回调中调用的操作。
正如 OznOg 所说,您应该将GCancellable
视为一种温和(且线程安全)告诉您的任务应该取消的方式。根据长时间运行的任务的编写方式,您可以在g_cancellable_is_cancelled()
每次循环迭代时检查一次,也可以将GSource
from添加g_cancellable_source_new()
到任务中的轮询循环中。
关于在 GLib 中使用线程的建议可能也与此处相关。
推荐阅读
- javascript - 仅发布请求发布 [object Object]
- c - 使用 cgo 构建共享对象时导出变量
- dart - Flutter 侧抽屉作为一个小部件
- java - 通过搜索子值firebase android获取列表中的uid
- wpf - 基于单元格的DataGrid行背景包含值WPF
- javascript - 错误:不再支持 Buffer.write(string, encoding, offset[, length])
- git - SSH : git 特殊存储库
- javascript - 如何找到 unicode 组合?
- javascript - TypeError: Object(...) 不是 react-redux 中的函数
- css - 具有绝对位置的居中子级与具有显示 flex 的父级