0

私はMainWindow w窓を持ってTestThread testThreadおり、のメンバーとしてw。単純なことはわかっていますが、testThread.foo()メソッドをtestThreadスレッドで実行できません(ウィンドウスレッドではありません)。つまり、QThread の動作がわかりません。

次のテスト アプリケーションの修正にご協力ください。QProgressBar *MainWindow::ui::progressBarQPushButton *MainWindow::ui::startButton(簡単に書くと)があります。毎秒インクリメントする(startButtonクリックで)開始したい。TestThread::foo(int* progress)int progress

メインウィンドウ:

MainWindow::MainWindow(QWidget *parent) : // ...
{
    // ...

    ui->progressBar->setRange(0, 5);
    progress = 0; // int MainWindow::progress

    this->connect(ui->startButton, SIGNAL(clicked()), SLOT(startFoo()));

    connect(this, SIGNAL(startFooSignal(int*)), &testThread, SLOT(foo(int*)));
        // TestThread MainWindow::testThread

    testThread.start();
}

// ...

void MainWindow::timerEvent(QTimerEvent *event)
{
    ui->progressBar->setValue(progress);
}

void MainWindow::startFoo() // this is a MainWindow SLOT
{
    startTimer(100);
    emit startFooSignal(&progress);
        // startFooSignal(int*) is a MainWindows SIGNAL
}

テストスレッド:

void TestThread::foo(int *progress) // this is a TestThread SLOT
{
    for (unsigned i = 0; i < 5; ++i) {
        sleep(1);
        ++*progress; // increment MainWindow::progress
    }
}

わかりました、これは簡単です。私は何か間違ったことをしています:)

PS動作を理解するために、最も単純な(可能な限り)例を実行したいと思いQThreadます。

ありがとう!

4

3 に答える 3

2

別の解決策の 1 つ: 別のスレッドで関数を実行したいだけで、QThread の使用を主張しない場合は、QT Concurrent Namespace を確認する必要があります。

次の例では、関数 foo() を別のスレッドで実行し、関数を呼び出す行でブロックしません。もちろん、関数がいつ終了するかを理解し、結果を取得し、それを待ち、実行を制御するためのメカニズムがあります。

void foo(int &progress) {...}

int progress;
QtConcurrent::run(foo, progress);

お役に立てれば

于 2011-03-06T17:57:39.570 に答える
2

重要な問題は、-function を含むオブジェクトをfoo()そのスレッドが所有するようにして、スロット呼び出しが正しいスレッドのイベントループからディスパッチされるようにすることです。

foo()(実際にオブジェクトを持っている必要はないことに注意してくださいTestThread。別のオブジェクトを関数QThreadWhatEver::foo()関数に使用できます。それも簡単かもしれませんが、わかりません..)

IIUC、これはあなたがしなければならないことです:

  • QObject ::moveToThread()を使用して、foo 関数を含むオブジェクトを TestThread に割り当てます (つまり、Qt::AutoConenction(デフォルトの) シグナル/スロット呼び出しは、スレッド全体で正しく実行され、各スレッド独自のイベント ループからディスパッチされます)。

オブジェクトを適切なスレッドが「所有」することで、スロット呼び出しは直接実行されるのではなく、そのスレッドのイベント ループでスケジュールされます。

それが役に立てば幸い。:)

于 2011-03-06T17:45:25.097 に答える
1

QThread::startおよびQThread::runを参照してください。

于 2011-03-06T16:58:37.943 に答える