0

I am using Qt to create a window and I have the following code (this is somewhat in pseudo-code):

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();
}

My issue is that when the_int->doupdate() is called in mainloop(), the reference to the_int is wrong. I think this has to do with the fact that console inherits QMainWindow, but I am not sure what the solution is.

MyInterface doesn't always get inherited by a QObject. I've tried to split the doupdate() from console into another class which gets passed the reference to console in the constructor, but get the same result.

Any ideas?

4

1 回答 1

1

Assuming your "pseudo-code" is close enough to your real code, the following is the problem:

console() {
  InterfaceHandler x(this);
}

Once the constructor is done, x, being a local (automatic) variable, gets destroyed. The InterfaceHandler instance you created no longer exists once the constructor returns.

You need to keep x as a member variable of that class, or create and store it from somewhere else. (But keeping it as a member makes sense since the lifetimes of the objects are tied.) You also need to be very careful with that thread, it needs to be stopped before console is destroyed.

于 2012-05-16T05:56:41.310 回答