从QThread类监视Qt GUI
Monitor Qt GUI from QThread class
我正在尝试运行一个后台线程(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
对象的事件队列实际上都是由启动它的线程处理的,这是非常不直观的。常见的解决方案是创建一个"handler"对象(从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的正确方式?
相关文章:
- Qt GUI使用Qfiledialogbox和qlabel显示视频,这是我的代码
- 试图打开并读取一个.txt文件,但它从原始文件中删除了实际文本(Qt GUI C++
- 是否可以在QT GUI应用程序中处理事件时播放加载动画指示器?
- 从其他std ::线程更新QT GUI
- 无法使用 Visual Studio 2010 和 Qt 版本 4.8.0 创建"Qt Gui Application"
- "hijacking" 给定根 QWidget* 的 Qt gui
- 尽管有线程,Qt GUI 仍挂起
- C++ Qt GUI update
- 在QT GUI中创建一个全局对象
- 在已经运行的C 控制台应用程序上实现QT GUI
- QT GUI最简单的方法可以从另一堂课访问MainWindow
- 通过Qt-tcp套接字更改Qt-GUI
- ROS-Qt GUI - 如何分发线程
- 由于线程问题,Qt-Gui没有更新
- 为Python逻辑创建一个C++Qt Gui
- Qt GUI应用程序在与GUI交互时停止实时进程
- 如何在C 中制作QT GUI应用,而不会内存泄漏
- 如何将QT GUI应用程序的版本打印到主机上
- 使用由Eclipse中的Qt设计器创建的Qt GUI
- Qt Gui 应用程序部署