Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- MyClass::MyClass(...)
- {
- OtherClass::getInstance()->setCallback(this);
- connect(this, SIGNAL(mySignalToMainThread()), this, SLOT(doThisOnMainThread()));
- }
- // Public slot, called by OtherClass on its own thread.
- void MyClass::someCallback()
- {
- emit mySignalToMainThread();
- }
- void MyClass::doThisOnMainThread()
- {
- // AHHH! I am still on callers thread.
- }
- void MyClass::someCallback()
- {
- Q_ASSERT(QThread::currentThread() != this->thread());
- emit mySignalToMainThread();
- }
- void MyClass::doThisOnMainThread()
- {
- Q_ASSERT(QThread::currentThread() == this->thread());
- }
- class MyClass : public QObject {
- Q_OBJECT
- public:
- explicit MyClass(QObject *parent = 0);
- signals:
- void mySignalToMainThread();
- public slots:
- void someCallback();
- void doThisOnMainThread();
- };
- MyClass::MyClass(QObject *parent) :
- QObject(parent) {
- std::cout << Q_FUNC_INFO << QThread::currentThreadId() << std::endl;
- OtherClass::getInstance().setCallback(this);
- connect(this, SIGNAL(mySignalToMainThread()), SLOT(doThisOnMainThread()));
- }
- void MyClass::someCallback() {
- std::cout << Q_FUNC_INFO << QThread::currentThreadId() << std::endl;
- emit mySignalToMainThread();
- }
- void MyClass::doThisOnMainThread() {
- std::cout << Q_FUNC_INFO << QThread::currentThreadId() << std::endl;
- }
- class OtherClass : public QObject {
- Q_OBJECT
- public:
- static OtherClass& getInstance();
- void setCallback(MyClass *cb);
- public slots:
- void doCallback();
- private:
- explicit OtherClass(QObject *parent = 0);
- MyClass *cb_;
- };
- OtherClass::OtherClass(QObject *parent) : QObject(parent) {
- std::cout << Q_FUNC_INFO << QThread::currentThreadId() << std::endl;
- }
- OtherClass& OtherClass::getInstance() {
- std::cout << Q_FUNC_INFO << QThread::currentThreadId() << std::endl;
- static OtherClass singleton;
- return singleton;
- }
- void OtherClass::doCallback() {
- std::cout << Q_FUNC_INFO << QThread::currentThreadId() << std::endl;
- cb_->someCallback();
- }
- void OtherClass::setCallback(MyClass *cb) {
- std::cout << Q_FUNC_INFO << QThread::currentThreadId() << std::endl;
- cb_ = cb;
- }
- int main (int argc, char **argv) {
- QApplication app(argc, argv);
- MyClass c;
- QThread other;
- OtherClass::getInstance().moveToThread(&other);
- other.connect(&other, SIGNAL(started()),
- &OtherClass::getInstance(), SLOT(doCallback()));
- other.start();
- QMainWindow w;
- w.show();
- return app.exec();
- }
- __thiscall MyClass::MyClass(class QObject *)00001108
- class OtherClass &__cdecl OtherClass::getInstance(void)00001108
- __thiscall OtherClass::OtherClass(class QObject *)00001108
- void __thiscall OtherClass::setCallback(class MyClass *)00001108
- class OtherClass &__cdecl OtherClass::getInstance(void)00001108
- class OtherClass &__cdecl OtherClass::getInstance(void)00001108
- void __thiscall OtherClass::doCallback(void)000015AC
- void __thiscall MyClass::someCallback(void)000015AC
- void __thiscall MyClass::doThisOnMainThread(void)00001108
Add Comment
Please, Sign In to add comment