1

我想创建一个线程并在打印“Hello”后从那里发出信号。想要连接到来自普通函数或另一个打印“世界”的线程的信号。如何在 Windows C++ 中做到这一点?基本上是信号/插槽通信的新手。

4

1 回答 1

3

有两个完全不同的问题:

  1. 在 C++ 中实现信号和
  2. 在另一个线程中调用函数

上次我混合它们时,我后悔了。绝对建议单独解决;无论如何,大多数信号处理程序都可能是同步的。

信号

  • C++11 引入了类型擦除委托,std::function可以用作委托,为信号创建它们的集合并不是那么工作。处理来自单独线程的连接/断开连接需要更多的工作,尽管在对象销毁时自动断开连接也是如此。Boost 为 C++03 环境提供了兼容的实现。
  • Boost 提供了信号和信号2库。前者不处理与单独线程的断开连接,因此您可能需要后者。
  • 有一个小的独立库libsigc++
  • Qt 包含复杂的信号和槽机制,不幸的是,它有点非 C++(它来自远古时代,当时 C++ 并不比带有类的 C 多多少)。

在单独的线程中调用函数

线程完全控制它执行的内容。因此,如果您想在另一个线程中执行某些操作,则需要在那里运行一个事件循环。由于您通常只能运行一个事件循环,因此您必须使用 GUI 库附带的事件循环(没有太多理由想要在不同的线程中运行某些东西,除了像大多数 GUI 库一样从线程处理 GUI 中完成某些事情不是线程安全的)

Qt 允许您在连接到信号时指定一个线程来运行处理程序。在其他框架中,您可能必须将一些消息发送到事件循环中。您可以使用std::function来指定要执行的内容。

于 2013-06-11T06:56:49.863 回答