2012-05-15 20 views
0

我使用Qt来创建一个窗口,我有以下代码(这多少有些伪代码):指向的QMainWindow更改

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

'the_int'应该被称为'the_iface'或其他东西,因为在一个C++问题中,我们通常假设'the_int'是一个整数。但无论如何......这是否只发生在与线程交互(例如可以在InterfaceHandler构造函数中调用'doupdate()',但以后变坏?) – HostileFork

+0

如何分配控制台对象?这不是在堆栈上吗? –

+0

'the_int'就在这个例子中。是的,这似乎是线程问题。当我在构造函数中调用它时,我没有任何问题。我在创建它之后(在构造函数中)打印出指针的位置,然后在我调用'mainloop()'时再次打印指针的位置,但它们不同。上面已经添加了我的'console'分配。 – zsalzbank

回答

1

假设你的“伪代码”足够接近您的真实代码,下面的问题是:

console() { 
    InterfaceHandler x(this); 
} 

一旦构造完成,x,是本地(自动)变量,被销毁。一旦构造函数返回,您创建的InterfaceHandler实例就不再存在。

您需要保留x作为该类的成员变量,或者从其他位置创建并存储它。 (但保持它作为一个成员是有道理的,因为这些对象的生命周期是绑定的。)您还需要非常小心该线程,它需要在console被销毁之前停止。

+0

当你认为自己已经尝试过某些东西时,你不讨厌它,它不起作用。这就是发生在这里的事情。谢谢让我再试一次。 – zsalzbank

相关问题