2016-06-02 21 views
0

Qtプロジェクトを検討する。私は、各クラスのtimerEventで計算を行い、QMainWindowで結果を表示するために、異なるQthreadを定義しました。ここで(!クラスA、BおよびCは同一であり、printf()のコンテンツのみが変更されることになる)異なる無限ループ(QTimerEvent)でQthreadを同期する

a.h

class A : public QObject 
{ 
    Q_OBJECT 
public: 
    explicit A(QObject *parent = 0); 
    void timerEvent(QTimerEvent *); 

private: 
    int timerId; 
}; 

A.cppある:

A::A(QObject *parent) : 
    QObject(parent) 
{ 
    timerId = startTimer(1000); 
} 

void A::timerEvent(QTimerEvent *) 
{ 
    printf("A\n"); 
} 

main.cppの通りであります以下:

int main(int argc, char *argv[]) 
{ 
    QCoreApplication a(argc, argv); 

    QThread thread_1, thread_2, thread_3; 

    A objA; 
    B objB; 
    C objC; 

    objA.moveToThread(&thread_1); 
    objB.moveToThread(&thread_2); 
    objC.moveToThread(&thread_3); 

    thread_1.start(); 
    thread_2.start(); 
    thread_3.start(); 

    return a.exec(); 
} 

plクラスのレイアウトを変更することはできません。問題は、このような状況でQthreadをどのように同期させるのですか?各クラスの結果は依存関係がありませんが、すべての結果が1秒ごとに同じ順序で使用できることを確認する必要があります。たとえば、結果は常にA B C A B C A B C ...と表示されなければなりません。ありがとうございます!

+1

逐次処理が必要な場合は、本当に別のスレッドを使用する必要がありますか? – TheDarkKnight

+0

"私は他の何かをしたいが、自分のコードを変更することはできません"その態度であなたはほんのちょうどあきらめることができます:( –

+0

@KubaOber何人かの人が助けてくれるのですが、 – Mogi

答えて

1

あなたが求めていることはできません。スレッド内で実行されているコードの実行時間は、コアがOSの残りの部分と共有されている場合と異なり、変化し、アクティブである時間も変わります。注文が変わるほど十分で、保証することができます。 ほとんどの並列システムでは、この時点ではすべてのタスクを並行処理し、結果をキューに入れ、並列セクションが終了したら(byやidなど)ソートして処理します。

MapReduceQtConcurrentにお試しください。または、タスクの依存関係を試してみてください。それは、Bの後にC、そしてAの後にBを実行するようにシステムに指示します。どのような順序制約を考える必要があります。

0

クラスA、B、Cを変更できない場合でも、スレッドに移動し、A、B、Cオブジェクトを所有し、イベント・タイマーを持ち、タイムアウト時にtimerEvent()は正しい順序で機能します。

これは、結果が順調であることが期待されるため、より意味があります。

しかし、これはスレッド同期に関する練習問題です。これらのクラスを条件変数のような何らかの同期を実行できるクラスにラップすると、次のクラスで現在のクラスが終了したことがわかります。

関連する問題