我正在使用Qt开发一个大型优化工具。为了更好的CPU使用率,我使用QThreads。然后我将工作对象(从QObject派生,包含非QObject数据成员)移动到线程中。一切看起来都很好,构建良好,并在Linux上使用GCC和Qt 4.8顺利运行
然而,在Windows下使用Qt 5.5使用MinGw,计算花费的时间更长。似乎线程在计算中的某处阻塞并被序列化。我显示了一些调试消息,以确保线程正常工作。似乎在Windows上存在bottelneck但在Linux下不存在。我不认为Qt版本有所作为,我宁愿认为问题是由MinGw引起的。 操作系统是Windows 7和Debian。 我使用Qt5编译的MinGw二进制文件。
是否需要进一步配置MinGw的Qt构建?或者,当将工作线程对象移动到线程中时,是否存在使用非QObject成员的问题?这可能是不同线程类型的问题,QThread在内部使用?提前谢谢: - )
编辑:
起始ob线程看起来像这样。
for (int i = 0; i < this->numberOfCores; i++)
{
QThread *thread = new QThread(this);
thread->setObjectName("Thread " + QString::number(i));
Calculator *calculator = new Calculator(/* Skip parameters */);
calculator->moveToThread(thread);
connect(calculator, SIGNAL(debugInfo(DebugData)), this, SIGNAL(debugInfo(DebugData)));
connect(this, SIGNAL(startCalculator()),
calculator, SLOT(startCalculation()));
connect(calculator, SIGNAL(solutionFound(Solution*)),
this, SLOT(addSolution(Solution*)));
connect(calculator, SIGNAL(calculationFinished()), this, SLOT(calculatorFinished()));
thread->start(QThread::HighestPriority);
我多次使用这种方法,它始终有效。
计算器然后只计算解决方案。每个计算器都有自己的数据,并且不存在竞争条件。他们都在处理完全不同的数据。
答案 0 :(得分:1)
在每次信号发射时,高优先级线程将与接收跨线程时隙调用的低优先级线程同步。这可能是平台差异的根源:不同的内核以不同的方式解决临时优先级提升问题,而在Linux上,事件循环来自glib,而Windows则不然。当涉及跨不同优先级的线程的同步时,它们的行为会有所不同。如果接收线程在事件循环中花费大量时间主动调度事件,则会对高优先级线程造成严重破坏。
也许与直觉相反,解决方案可能就像而不是一样简单,使计算线程具有高优先级。
无论如何,您的用户会讨厌剥夺他们在某些应该在后台运行的计算的交互性能。计算线程将抢占默认优先级GUI线程,系统会觉得交互式用户非常迟钝,这也适用于您自己的UI!计算线程应该是 lower 优先级。这当然假设计算不用于驱动交互(例如游戏中的物理引擎);如果他们这样做,并且您认为应用程序应该得到它,那么您必须提高整个过程的优先级。
答案 1 :(得分:0)
你如何启动线程?
#include <QObject>
#include <QThread>
class _Object : public QObject
{
Q_OBJECT
public:
explicit _Object(QObject *parent = 0);
void _setup(QThread &th);
public slots:
void do_stuff_you_want();
};
和_Object.cpp
:
#include "_object.h"
_Object::_Object(QObject *parent) :
QObject(parent)
{
}
void _Object::_setup(QThread &thread)
{
connect(&thread,SIGNAL(started()),this,SLOT(do_stuff_you_want()));
}
void _Object::do_stuff_you_want(){......}
在main.cpp
:
#include <all_u_need>
#include <QThread>
#include "_object.h"
int main(.. .. ..)
{
...
QThread thread_obj_runns_in;
_Object object_to_run;
object_to_run._setup();
object_to_run.moveToThread(&thread_obj_runns_in);
thread_obj_runns_in.start();
...
return app.exec();
}
我在使用run()
和QThread子类时遇到了很多问题。
当我开始像这样使用它时,我再也没遇到过线程问题了。
我想说的是:创建一个QObject并将其移动到一个线程,并且不要将QThread子类化。
我希望我能帮助你。