2011-11-27 115 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; 
相關問題