2017-01-27 36 views
0
捕獲信號

當我發出信號,從它在不同的線程運行的QObject到主窗口爲什麼MainThread不抓住它,我使用Ubuntu 16.04 某個時候趕上但在此之後,僅出現一次螺紋繼續在事件循環中運行, 我只是想完成線程,如果有些工作就完成了,然後後,我不得不重用....的QMainWindow不是從QThread的

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    explicit MainWindow(QWidget *parent = 0); 
    ~MainWindow(); 
    class newiDeviceDetect *deviceDetect; 

private: 
    Ui::MainWindow *ui; 


public slots: 
    void on_deviceDetected(); 

}; 


class newiDeviceDetect : public QObject 
{ 
    Q_OBJECT 
public: 
    explicit newiDeviceDetect(QObject *parent = 0); 
    QThread *newDeviceThread; 

signals: 
    void killMe(); 

public slots: 
    void threadWorker(); 
}; 


MainWindow *mainClass; 
static void usbHotPlugDetectHand(int sig) 
{ 
    qDebug() << "GOT SIGNAL" + QString::number(sig); 
    emit mainClass->usbHotPlugDetect(); 
} 

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
    mainClass = this; 

    deviceDetect = new newiDeviceDetect; 
    connect(deviceDetect,SIGNAL(killMe()),this,SLOT(on_deviceDetected())); 

    signal(SIGUSR1,usbHotPlugDetectHand); 
    connect(this,SIGNAL(usbHotPlugDetect()),this,SLOT(on_usbHotPlugDetect())); 
} 

MainWindow::~MainWindow() 
{ 
    delete ui; 
} 

void MainWindow::on_usbHotPlugDetect() 
{ 
    deviceDetect->threadLock.lock(); 
    deviceDetect->newDeviceThread->start(); 
} 

void MainWindow::on_deviceDetected() 
{ 
    deviceDetect->newDeviceThread->terminate(); 
    deviceDetect->newDeviceThread->wait(); 
    deviceDetect->threadLock.unlock(); 
} 

newiDeviceDetect::newiDeviceDetect(QObject *parent) : QObject(parent) 
{ 
    newDeviceThread = new QThread; 
    connect(newDeviceThread,SIGNAL(started()),this,SLOT(threadWorker())); 
    moveToThread(newDeviceThread); 
    //Some Work 
} 

void newiDeviceDetect::threadWorker() 
{ 
    sleep(5); 
    //Some Work 

    killMe(); 
} 

在我的代碼threadWorker工作很好,但是當它向MainWindow發送killMe信號時,MainWindow類行的也趕上吧,,我必須完成/終止newDeviceThread再次使用它

知道的任何幫助,三江源

+0

在哪個操作系統? 「QThread」如何運行?他們每個人都有其事件循環? –

+0

在Linux上,我沒有太多的知識什麼是在引擎蓋下@BasileStarynkevitch –

+0

請改善您的問題,編輯它,不要評論它。 –

回答

0

您需要將信號連接爲您創建的每一個新的線程,看來你只做一次,你的代碼看起來有點混亂。

我的意思後

newDeviceThread = new QThread; 
connect(newDeviceThread,SIGNAL(started()),this,SLOT(threadWorker())); 

你還需要一個連接到您的終止工作線程,你的情況插槽我覺得MainWindow::on_deviceDetected()

這究竟是什麼原因呢? class創建一個新的類,也許這不是你想要的那種情況...

class newiDeviceDetect *deviceDetect;