Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将Java应用程序移植到C++;(qt) 我用Swing编写了java应用程序,现在我尝试用C++重写。Java中的程序有一个控制器,它引用了事件的模型、视图和阻塞队列。当视图中发生某个事件时,新事件被放入BlockingQueue并由控制器和模型处理。然后SwingUtilities.invokeLater()在Swing中调用了一些操作 如何在C++中使用QT来实现这样的操作?我已经编写了这个模型,但我不知道如何通过类似于Java中的BlockingQueue的东西将它与用Qt编写的UI连接起来。_Java_C++_Model View Controller_Qt_Blockingqueue - Fatal编程技术网

将Java应用程序移植到C++;(qt) 我用Swing编写了java应用程序,现在我尝试用C++重写。Java中的程序有一个控制器,它引用了事件的模型、视图和阻塞队列。当视图中发生某个事件时,新事件被放入BlockingQueue并由控制器和模型处理。然后SwingUtilities.invokeLater()在Swing中调用了一些操作 如何在C++中使用QT来实现这样的操作?我已经编写了这个模型,但我不知道如何通过类似于Java中的BlockingQueue的东西将它与用Qt编写的UI连接起来。

将Java应用程序移植到C++;(qt) 我用Swing编写了java应用程序,现在我尝试用C++重写。Java中的程序有一个控制器,它引用了事件的模型、视图和阻塞队列。当视图中发生某个事件时,新事件被放入BlockingQueue并由控制器和模型处理。然后SwingUtilities.invokeLater()在Swing中调用了一些操作 如何在C++中使用QT来实现这样的操作?我已经编写了这个模型,但我不知道如何通过类似于Java中的BlockingQueue的东西将它与用Qt编写的UI连接起来。,java,c++,model-view-controller,qt,blockingqueue,Java,C++,Model View Controller,Qt,Blockingqueue,听起来您想使用QThread创建一个工人类。看看Qt'Mandelbrot在响应GUI事件的线程中所做工作的示例:如果可能,我会避免使用线程。在没有你方进一步澄清的情况下,我建议你看一下报告。简而言之,信号和插槽是Qt中事件处理的默认方式。与小部件交互会触发信号。您的类可以将自己连接到这样的信号并对其作出反应 我意识到这个答案相当模糊。如果您添加了更多关于您想要完成的具体内容的详细信息,我将很高兴地更新它:)每个QObject中都有与阻塞队列等效的内容。QoObject的Qt文档中没有明确说明(

听起来您想使用QThread创建一个工人类。看看Qt'Mandelbrot在响应GUI事件的线程中所做工作的示例:

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


我意识到这个答案相当模糊。如果您添加了更多关于您想要完成的具体内容的详细信息,我将很高兴地更新它:)

每个
QObject
中都有与阻塞队列等效的内容。QoObject的Qt文档中没有明确说明(就像应该的那样!),但是每个QoObject都有一个有效的事件队列。您可以使用static
QCoreApplication::postEvent
方法从任何线程将事件发布到任何QObject——只要您有指向QObject的指针,就可以将事件发布到它

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

这些内置事件队列非常有用,因为它们固有地允许您序列化对QObject的访问,因此您不必添加额外的同步原语,并且可以避免设置死锁。使用ad-hoc同步会带来麻烦,不幸的是,即使是Java在设计上也出了问题。请看赫伯·萨特关于这个话题的精彩报道:和。他有很多其他的,这是一个真正的知识宝库。他还解释了如何设计从运行到完成、短而甜美的异步应用程序以获得良好的性能


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

您是指Java本机接口吗?事件队列是与QObject关联,还是与QObject所属的QThread关联?我习惯于使用将QObject移动到新的QThread,例如,
worker=newQThread;moveToThread(worker);worker->start()。然后,使用
Qt::QueuedConnection
连接的任何
connect
都将自动使用该线程的事件队列。这就是您正在谈论的队列吗?对于
QObject
的用户来说,似乎队列是特定于对象的,因为对象的用户看不到传递给任何其他对象的事件,并且无论对象在哪个线程中,行为都是相同的。队列是否真正属于给定线程中创建的最外层事件循环是一个实现细节。它对性能有一些影响,也就是说,在某些情况下,如果你因为这个细节而不小心,你可能会得到二次行为。但在大多数情况下,这并不重要。