将 Java 应用程序移植到 C++ (qt)

Porting Java application to C++ (qt)

本文关键字:C++ qt Java 应用程序      更新时间:2023-10-16

我已经使用 Swing 用 Java 编写了应用程序,现在我正在尝试用 C++ 重写它。Java中的程序具有控制器,该控制器引用了事件的Model,View和BlockingQueue。当视图中发生某些事情时,新事件被放入 BlockingQueue 并由控制器和模型处理。然后一些操作由 SwingUtilities.invokeLater() 在 Swing 中调用。

如何使用Qt在C++中做这样的事情?我已经编写了模型,但我不知道如何通过Java的BlockingQueue之类的东西将其与Qt编写的UI连接起来。

如果可能的话,我会避免使用线程。在您方面没有任何进一步的澄清的情况下,我建议您查看信号和插槽的Qt文档。简而言之,信号和插槽是Qt中事件处理的默认方式,与小部件交互会导致信号被触发。您的类可以将自己连接到这样的信号并对其做出反应。

我意识到这个答案很模糊。如果您添加有关您想要完成更多详细信息,我很乐意将其更新:)

相当于 BlockingQueue 是每个QObject固有的。在QObject的Qt文档中没有明确说明(应该是这样!),但是每个QObject都有一个有效的事件队列。您可以使用静态QCoreApplication::postEvent方法从任何线程将事件发布到任何 QObject - 只要您有一个指向 QObject 的指针,您就可以将事件发布到它。

Qt::QueuedConnection类型的信号槽连接使用相同的事件队列来发布内部QMetaCallEvent事件。这些事件由QObject::event()拾取,并导致对相关槽的调用。当控制返回到线程的事件循环时,后者查看事件队列并将事件传递给QObject::event()方法。

这些内置事件队列非常有用,因为它们本质上允许您序列化对 QObject 的访问,因此您不必添加额外的同步原语,并且避免将自己设置为死锁。不幸的是,使用临时同步会导致麻烦,甚至Java在设计上也出错了。请参阅Herb Sutter关于此主题的出色阐述:死锁的多面性,并避免在关键部分中调用未知代码。他有很多关于这个和相关主题的其他出版物,这是一个真正的知识宝库。他还解释了如何设计运行到完成、简短而甜蜜的异步应用程序以获得良好的性能。

如果你的设计基于QObjects

以及使用信号槽和事件发布在它们之间的连接,那么你已经准备好将这些QObjects中的任何一个移动到专用的QThread,如果你的分析/基准测试表明需要这样做。但是,任何派生自 QWidget 的东西都不能离开 GUI 线程。

听起来你想用QThread创建一个worker类。看看Qt'Mandelbrot在响应GUI事件的线程中完成的工作示例:http://doc.qt.io/qt-4.8/qt-threads-mandelbrot-example.html