2011-11-27 72 views
3
class A : public QObject{ 

    Q_OBJECT 

signals: 
    void a_sig(); 

public: 
    A(){ } 

public slots: 
    void begin(){ 
    QObject::connect(&_timer, SIGNAL(timeout()), this, SIGNAL(a_sig())); 
    _timer.start(1000); 
    } 

private: 
    QTimer _timer; 
}; 


class B : public QObject{ 

    Q_OBJECT 

public: 
    B(){ value = 0; } 

public slots: 
    void b_slot(){ 

    ++value; 
    QFile file("out.txt"); 
    file.open(QIODevice::WriteOnly); 
    QTextStream out(&file); 
    out << value << "\n"; 
    file.close(); 
    } 

private: 
    int value; 
}; 

int main(int argc, char **argv){ 

    QCoreApplication app(argc, argv); 

    A a; 
    B b; 
    QThread aThread; 
    QThread bThread; 

    QObject::connect(&aThread, SIGNAL(started()), &a, SLOT(begin())); 
    QObject::connect(&a, SIGNAL(a_sig()), &b, SLOT(b_slot())); 

    a.moveToThread(&aThread); 
    b.moveToThread(&bThread); 

    aThread.start(); 
    bThread.start(); 

    return app.exec(); 
} 

我试图理解为什么b_slot()是没有得到调用。任何人能解释发生了什么,为什么b_slot()是没有得到叫什么名字?为什么signal/slot不能与多线程一起工作?

回答

5

的问题是A类的_timer构件的所有权。

既然你没有明确地初始化它,它没有父对象初始化。所以a.moveToThread(&aThread)计时器不会移动到aThread,事情得到之后感到困惑。

变化A的构造函数:

A() : _timer(this) {} 

和你b_slot()将被调用。

2

问题是虽然对象a被移动到aThread,_timer对象仍然属于原始主线程。尝试初始化_timer里面的begin方法如下:

void begin() { 
    _timer = new QTimer; 
    QObject::connect(_timer, SIGNAL(timeout()), this, SIGNAL(a_sig())); 
    _timer->start(1000); 
    } 

private: 

    QTimer *_timer; 
相关问题