首页 > 解决方案 > 如何从另一个线程(Glib 线程)中取消一个线程?

问题描述

我正在使用 GTK 和 GLib 中的线程函数开发一个应用程序库。我有一个线程(从现在起将被称为线程 A),当我在某个图形窗口中单击“确定”按钮时创建该线程。线程 A 开始执行一些繁重的任务。另一个名为“取消”的按钮可用于随时停止和结束线程 A。

我的目标是为当我点击能够结束线程 A 的“取消”按钮(线程 B)时创建的线程编写一个函数。

我用函数创建线程g_thread_createA。但是我找不到任何类似于g_thread_cancel使用线程 B 停止线程 A 的函数。这可能还是不能完成?

非常感谢您提供的任何信息。

标签: multithreadinggtk3glib

解决方案


您可能要考虑使用GTask在线程中运行任务,而不是使用手动创建的线程。如果使用g_task_run_in_thread(),该操作将自动在单独的线程中运行。

GTask与 集成GCancellable,因此要取消您将从g_cancellable_cancel()“取消”按钮在回调中调用的操作。

正如 OznOg 所说,您应该将GCancellable视为一种温和(且线程安全)告诉您的任务应该取消的方式。根据长时间运行的任务的编写方式,您可以在g_cancellable_is_cancelled()每次循环迭代时检查一次,也可以将GSourcefrom添加g_cancellable_source_new()到任务中的轮询循环中。

关于在 GLib 中使用线程的建议可能也与此处相关。


推荐阅读