0

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常に a に継承されるとは限りませんQObjectdoupdate()fromをコンストラクターでconsole参照を渡す別のクラスに分割しようとしましconsoleたが、同じ結果が得られます。

何か案は?

4

1 に答える 1

1

「擬似コード」が実際のコードに十分近いと仮定すると、次の問題が発生します。

console() {
  InterfaceHandler x(this);
}

コンストラクターが完了するとx、ローカル(自動)変数である、は破棄されます。コンストラクターが戻ると、作成したInterfaceHandlerインスタンスは存在しなくなります。

xそのクラスのメンバー変数として保持するか、別の場所から作成して保存する必要があります。(ただし、オブジェクトの存続期間が関連付けられているため、メンバーとして保持することは理にかなっています。)また、そのスレッドには十分注意する必要がありますconsole。破棄される前に停止する必要があります。

于 2012-05-16T05:56:41.310 に答える