Монитор Qt GUI из класса QThread - PullRequest
3 голосов
/ 09 июня 2011

Я пытаюсь запустить фоновый поток (qthread), который должен отслеживать флажок в графическом интерфейсе, и он не будет работать!Он строит, но во время выполнения я получаю эту ошибку:

"Необработанное исключение в 0x0120f494 в program.exe: 0xC0000005: Место чтения нарушения доступа 0xcdcdce55."

, и оно разрывается в строке "connect",Каков наилучший способ сделать это?

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
    }
}

1 Ответ

3 голосов
/ 09 июня 2011

Очередь событий любого объекта 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();

Один ключевой момент: не создавать подкласс QThread- вся фактическая работа выполняется в вашем объекте-обработчике.

Надеюсь, это поможет!

См. также: Qt: правильный способ публикации событий в QThread?

...