具有Qt事件循环的可移植通用共享库设置
Portable generic shared library setup with Qt event loop
我们试图编写一个可移植的共享库,为了方便起见,它使用了一些Qt类(主要是QTimer
和QTcpSocket
(;虽然没有GUI的东西。根据信号/时隙连接似乎需要一些Qt事件循环,因此我们按照本答案中所述"启动"QCoreApplication
。因此,我们设置了一个执行繁重工作的工作器对象,并将其移动到QThread
。
我们现在遇到的问题是,QThread
的所有者对象(在主线程内(和QThread
中的worker对象之间的排队连接似乎永远不会在Linux系统上得到处理,至少只要实现我们库的程序没有在主线程中提供任何进一步的Qt事件循环。这不是很有帮助,因为从worker传递到主线程的数据应该使用一些回调函数进一步传递,但是现在永远不会被调用。
因此,我的问题是:有没有办法让事件循环在库主线程中工作而不锁定它或主机程序(当只是在那里放置QCoreApplication::exec()
或类似内容时,情况似乎就是如此(?还是我们必须建立一个不同的线程间通信方案(独立于Qt(来处理这些数据传输?
由于我们不知道主机软件是否会在QApplication
上运行,理想情况下,在设置主线程事件循环之前,我也会对此进行检查。一个简单的if(qApp != nullptr)
就足够了吗?
PS:我尝试过一些但对我不起作用的事情:
- 在从主线程启动的
std::thread
中设置QEventLoop
(可能不起作用,因为仍然不在主线程中( - 在主线程类中设置
QEventLoop
并使用QTimer
定期触发其processEvents()
函数(可能由于主函数中缺少QTimer::timeout
信号的事件循环而不起作用( - 在
std::thread
中启动QCoreApplication
(在Windows上给出运行时警告,指出QCoreApplication应在主线程中启动(
在Qt用语中,回调称为Qt::DirectConnection
。但是,当然,这些回调将在您的工作线程上运行。但是任何其他使用回调的库都是这种情况,所以Qt在这里不是问题,你的代码也不是:基本思想具有此属性。
如果主机应用程序没有使用事件循环(任何事件循环,不一定是Qt(,那么除了轮询之外,你什么也做不了——见下文。
如果主机应用程序运行 X11 事件循环,则需要确保 Qt 副本使用与主机应用程序相同的底层事件循环。通常,这将是 glib 的事件循环,然后它应该自动工作。否则,您需要将Qt事件循环使用的同步原语的文件描述符传递给用户,并且用户需要将其集成到他们的事件循环中。无论你是否使用Qt,你都会面临同样的问题:滚动你自己的通信方法不会解决它,因为你仍然需要一个可等待的原语,它可以与用户正在使用的任何事件循环进行互操作。
当然,用户可以随时轮询回调:公开转发给QCoreApplication::processEvents()
的mainPoll()
方法。
尽管接受了另一个答案(我认为更正确(,但我仍然想提到一个效果出奇的解决方法:我们实际上设法解决了大多数系统上的事件循环/线程问题,方法是将工作线程信号与设置worker的类的构造函数中的lambda函数连接起来。
现在,我怀疑这种行为是否正确线程安全,并且在connect
函数调用中声明相对冗长的 lambda 函数肯定不是好的风格。但是,如果其他人最终遇到此问题,这可能是短期解决方案或(临时(解决方法。
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 在C++/Linux中设置单调时钟的一些技巧
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 具有Qt事件循环的可移植通用共享库设置
- 如何在进入动态打开的共享库时设置断点?
- 在VS2017中,我们如何在项目成员之间共享编译设置
- 将共享 ptrs 设置为空
- C++设计:如何设置共享一组变量的两个类
- C++ VS2015:媒体资源页是共享设置
- 如何在Windows Cmake中设置DLIB作为静态安装的共享LIB
- 范围之后,在Lambda中设置的共享指针
- 如何在 Linux 上将 googleTest 设置为共享库
- 如何在共享库中的确切行号上设置一个断点
- 如何编译、设置和制作在 Linux 中共享的库 .so
- 在共享对象文件中设置 GDB 断点
- 如何在Linux中使用QTCreator中的dlopen打开的共享库中设置断点
- 使用共享指针时是否需要设置析构函数方法
- 正在设置由boost创建的共享内存的权限
- 如何设置共享指针为普通指针