从另一个线程中断 event_base_dispatch

Posted

技术标签:

【中文标题】从另一个线程中断 event_base_dispatch【英文标题】:Break event_base_dispatch from another thread 【发布时间】:2014-09-16 07:42:19 【问题描述】:

我可以将在另一个线程中运行的event_base_loopbreak 调用到int event_base_dispatch(struct event_base *base) 吗?

【问题讨论】:

添加大约 2~3 行上下文使得人们更有可能回答您的问题 - 这真的简洁。 【参考方案1】:

可以使用来自另一个线程的event_base_loopbreak 来停止event_base_dispatch。只需在创建event_base 之前调用evthread_use_pthreadsevthread_use_windows_threads 即可启用多线程支持。

【讨论】:

我遇到了这个问题,即在另一个线程中与 EVLOOP_NO_EXIT_ON_EMPTY 一起使用的 event_base_loop 没有执行在主线程中创建的事件。一旦我将 evthread_use_pthreads 放在 event_base 创建之前,它就起作用了。非常感谢队友【参考方案2】:

从事件循环外部调用 event_base_loopbreak 实际上没有效果,在循环内部,event_base_loopbreak 不会从循环中中断。所以,调用 event_base_loopbreak 到 int event_base_dispatch(struct event_base *base) 在另一个线程中运行,应该没有任何效果。

【讨论】:

那么,如何从另一个线程停止 event_base_dispatch?或者我可以在 event_base_dispatch 工作时向 event_base 添加事件吗?【参考方案3】:

我也遇到了同样的问题,无论从其他线程调用 event_base_loopbreak() 还是 event_add() 都不起作用。

参考How to break out libevent's dispatch loop,我必须在启动事件循环之前设置一个计时器事件,并轮询退出标志以从事件回调中调用 event_base_loopbreak(),这样才能成功退出事件循环

【讨论】:

以上是关于从另一个线程中断 event_base_dispatch的主要内容,如果未能解决你的问题,请参考以下文章

从另一个线程访问线程本地

从另一个线程访问 UI 线程的视图

如何从另一个线程取消 GTK3 线程?

信号没有从另一个线程调用槽

从另一个线程更新 oxyplot 模型

MFC:从另一个线程访问 GUI?