2016-04-08 13 views
0

Qtを使用して大規模な最適化ツールを開発しています。私はQThreadsを使用してより良いCPU使用率を得るために。次に、ワーカーオブジェクト(非QObjectデータメンバーを含むQObjectから派生)をスレッドに移動します。 GCCとQtを使ってLinux上でうまくいっていて、スムーズに動作します。4.8Q WindowsでMinGwを使用するスレッドが正しく動作しない

WindowsではQt 5.5を使用してMinGwを使用すると、計算時間が大幅に短縮されました。スレッドは計算のどこかでブロックされており、シリアル化されているようです。スレッドが正しく動作していることを確認するために、いくつかのデバッグメッセージを表示しました。 Windowsには存在するが、Linuxでは存在しないボトルネックがあるようです。私は、Qtバージョンが違いを生むとは思わない、私はむしろ問題がMinGwによって引き起こされたと思うだろう。 OSはWindows 7とDebianです。 Qt5のコンパイルされたMinGwバイナリを使用します。

MinGwのQtビルドに必要な設定はありますか?または、ワーカーオブジェクトをスレッドに移動するときに、非QObjectメンバーを使用する際に問題がありますか?これは、QThreadが内部で使用するさまざまなスレッドの種類に問題がありますか?始動はスレッドがこのようになりますOB

EDIT :-)事前にありがとうございます。

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); 

私はこのアプローチを複数回使用していましたが、それは常に有効でした。

Calculatorは、ソリューションを計算するだけです。各カレンダーには独自のデータがあり、競合条件はありません。それらはすべて完全に異なるデータで動作します。

+0

表示されていないコードに問題がある可能性があります。 – dtech

+0

同じマシンで実行していますか?別のOSですか? – thuga

+0

@thuga同じ物理マシンDebianを使った仮想マシン – Liachtei

答えて

1

各信号放射では、優先度の高いスレッドは、クロススレッドスロットコールを受信する低優先度のスレッドと同期します。おそらくプラットホームの違いの原因になります。異なるカーネルは、一時的な優先順位の向上を別々に扱います.Linuxでは、イベントループはglibから、Windowsではそうではありません。優先度の異なるスレッド間での同期化については、動作が異なります。受信スレッドがイベントループで時間を費やしてイベントをアクティブに送信すると、優先度の高いスレッドで混乱を招く可能性があります。

おそらく、直感的には、解決策はではなく、と同じくらい単純なので、計算スレッドの優先度が高くなる可能性があります。

とにかく、バックグラウンドで実行する必要がある計算のために、インタラクティブなパフォーマンスを奪ってしまうことをユーザーが嫌になります。計算スレッドは、デフォルトの優先度のGUIスレッドを優先します。システムは対話型のユーザーにとって非常に鈍いと感じています。これはあなた自身のUIにも当てはまります!代わりに、計算スレッドはより低い優先度である必要があります。これはもちろん、計算がインタラクションを駆動するために使用されないことを前提とする(例えば、ゲーム内の物理エンジン)。アプリケーションがそれにふさわしいと思うならば、プロセス全体の優先順位を上げる必要があります。

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をサブクラス化しないことです。

私はあなたを助けてくれることを願っています。

+0

私はQThreadをサブクラス化しませんでした。編集を参照してください。しかし、とにかくありがとう – Liachtei

+0

はい私はあなたのコードを見ていない:) –

関連する問題