2012-05-15 49 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

相關問題