我正在尝试运行一个后台线程 (qthread),它需要在 gui 中监视一个复选框,但它不会运行!它构建但在运行时我收到此错误:
“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
}
}
最佳答案
任何QThread
对象的事件队列实际上是由启动它的线程处理的,这是很不直观的。常见的解决方案是创建一个“处理程序”对象(派生自 QObject
),通过调用 moveToThread
将其与您的工作线程相关联,然后将复选框信号绑定(bind)到一个插槽这个对象的。
代码看起来像这样:
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
子类化——所有实际工作都在您的处理程序对象中完成。
希望这对您有所帮助!
关于c++ - 从 QThread 类监控 Qt GUI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6284959/