我正在使用Qt创建一个窗口,我有以下代码(这在某种程度上是伪代码):
class MyInterface {
virtual void doupdate() = 0;
}
class InterfaceHandler {
InterfaceHandler(MyInterface *i) {
the_int = i;
start_thread(&mainloop);
}
void mainloop() {
while(1) the_int->doupdate();
}
MyInterface *the_int;
}
class console : public QMainWindow, public MyInterface {
console() {
InterfaceHandler x(this);
}
void doupdate() {
//code to modify the gui
}
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
console w(argc, argv);
w.show();
return a.exec();
}
我的问题是,在the_int->doupdate()
中调用mainloop()
时,对the_int
的引用是错误的。我认为这与console
继承QMainWindow
的事实有关,但我不确定解决方案是什么。
MyInterface
并非始终由QObject
继承。我试图将doupdate()
从console
拆分到另一个类中,该类在构造函数中传递给console
的引用,但得到相同的结果。
有什么想法吗?
答案 0 :(得分:1)
假设您的“伪代码”足够接近您的真实代码,则问题如下:
console() {
InterfaceHandler x(this);
}
构造函数完成后,作为本地(自动)变量的x
将被销毁。一旦构造函数返回,您创建的InterfaceHandler
实例就不再存在。
您需要将x
保留为该类的成员变量,或者从其他位置创建并存储它。 (但是保持它成为一个成员是有道理的,因为对象的生命周期是相关的。)你还需要非常小心该线程,它需要在console
被销毁之前停止。