2

私はしばらくの間Qtを学んでいて、数日前にによってマルチスレッド化を続けることにしましたQThread。私はこの人をフォローしています。サブクラス化QThreadは適切な方法ではなく、を使用することであると彼は言っているのでQObject。私は彼の方法に従っています。しかし、彼はから継承する別のクラスを作成しましたQObject。私はいくつかの変更を加えることにしました:

class myclass
{
private:
    dowork();

private slots:
    slota();
    slotb();
    slotc();
}

myclass::dowork()
{
    QThread lett;
    QThread latt;
    QThread pltt;
    QObject lethread;
    connect(&lett, SIGNAL(started()), this, SLOT(slota()));
    lethread.moveToThread(&lett);
    QObject lathread;
    connect(&latt, SIGNAL(started()), this, SLOT(slotb()));
    lathread.moveToThread(&latt);
    QObject plthread;
    connect(&pltt, SIGNAL(started()), this, SLOT(slotc()));
    plthread.moveToThread(&pltt);

    lett.start();    
    latt.start();
    pltt.start();/*
    lett.wait();
    latt.wait();
    pltt.wait();*/
    while(lett.isRunning())
    {
        //qDebug() << "Still Running!";
    }
    lett.quit();
}

プログラムを実行すると、whileループが無限に実行され続けます。それはまったく出てこない。私qdebugは3つのスロットの実装内で、スロットが入っているかどうかを確認するために使用しましたが、驚くべきことに、どのスロットも呼び出されません。どうしてこんなことに?のコメントを削除すると.wait、プログラムが一時停止します。

この方法の何が問題になっていますか?私のプログラムは非常に小さいので、その余分なクラスは避けたいと思います。

4

1 に答える 1

2
while(lett.isRunning())
{
    //qDebug() << "Still Running!";
}
lett.quit();

ひどく間違っています。現在のスレッドは待機中に忙しく、常に食べています。しかし、これはあなたの問題ではありません。あなたの問題は確かに、メインイベントループがおそらくまだ開始されていないことです。つまり、まだ開始していませQApplication.exec()ん。

Qtはイベントを使用してスレッドを開始します。、を使用するmovetoThreadstart、特定のイベントが現在のスレッド(つまり、これらのメソッドを実行するスレッド)でキューに入れられます。メインイベントループがすでに開始されている場合は、できるだけ早く処理されます。しかし、あなたの場合、あなたの主な機能は次のとおりです。

 int main(){
   QApplication app();
   myclass onlyclassIwanttomake;
   onlyclassIwanttomake.dowork(); 
   app.exec(); <----HERE!!!
 }

メインスレッドが実行されると、スレッドが開始されますapp.exec();。待機で忙しいときは、メインスレッドがイベントの開始に必要なイベントを処理できないようにしています。

編集:まあ、別の問題はそれです

lett.start();    
latt.start();
pltt.start();

開始された3つのスレッドを開始し、永久にアイドル状態を維持します。彼らは何もしていませんが、実行しています(ループを削除しても)。

これはQtスレッドについて書かれたエントリです。時間をかけてお読みください。

于 2012-10-26T13:14:50.733 に答える