3

GUI のチェックボックスを監視する必要があるバックグラウンド スレッド (qthread) を実行しようとしていますが、実行されません! ビルドしますが、実行時に次のエラーが発生します。

「program.exe の 0x0120f494 で未処理の例外: 0xC0000005: アクセス違反の読み取り場所 0xcdcdce55.」

そして、「接続」行で壊れます。これを行う最善の方法は何ですか?

guiclass::guiclass(){
    thread *t = new thread();
}

thread::thread(){
     guiclass *c = new guiclass();
     connect(c->checkBox, SIGNAL(stateChanged(int)), this, SLOT(checked(int)));

     ....
     start work
     ....
}

bool thread::checked(int c){
     return(c==0);
}

void thread::run(){

    if(checked()){
        do stuff
    }
}
4

1 に答える 1

3

オブジェクトのイベント キューは、QThread実際にはそれを開始したスレッドによって処理されますが、これは非常に直感的ではありません。一般的な解決策は、「ハンドラー」オブジェクト ( から派生QObject) を作成し、 を呼び出してワーカー スレッドに関連付けmoveToThread、チェックボックス シグナルをこのオブジェクトのスロットにバインドすることです。

コードは次のようになります。

class ObjectThatMonitorsCheckbox : public QObject
{
     Q_OBJECT
     // ...

public slots:
     void checkboxChecked(int checked);
}

スレッドを作成するコードでは:

QThread myWorkerThread;

ObjectThatMonitorsCheckbox myHandlerObject;

myHandlerObject.moveToThread(&myworkerThread);
connect(c->checkBox, SIGNAL(stateChanged(int)), &myHandlerObject, 
    SLOT(checkboxChecked(int)));

myWorkerThread.start();

1 つの重要なポイント: サブクラス化しないQThreadでください。実際の作業はすべて、ハンドラー オブジェクトで行われます。

お役に立てれば!

参照: Qt: イベントを QThread に投稿する正しい方法は?

于 2011-06-08T20:47:18.310 に答える