我想创建一个线程并在打印“Hello”后从那里发出信号。想要连接到来自普通函数或另一个打印“世界”的线程的信号。如何在 Windows C++ 中做到这一点?基本上是信号/插槽通信的新手。
问问题
600 次
1 回答
3
有两个完全不同的问题:
- 在 C++ 中实现信号和
- 在另一个线程中调用函数
上次我混合它们时,我后悔了。绝对建议单独解决;无论如何,大多数信号处理程序都可能是同步的。
信号
- 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 回答