2017-01-27 3 views
0

からの信号をキャッチませんスレッドには、私のコードのthreadWorkerに....いくつかの作業が行われている場合、私はちょうど、スレッドを終了したいと、その後の後、私はそれを再利用する必要があり、 イベントループ内で実行するQMainWindow私はMainThreadがそれをキャッチしていない理由を別のスレッドで実行されているQObjectをからメインウィンドウに信号を発するとき、私はUbuntuの16.04 を使用して、いつかそれがキャッチだけ、その後一度に起こることをしています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(); 
} 

を続けて取り組んでいますしかし、それがMainWindowにkillMeを通知するとき、メインウィンドウクラスはそれをキャッチdoest ,,私は、newDeviceThreadは

おくるどれヘルプ再びそれを使用するためにありがとう

あなたが作成するすべての新しいスレッドのための信号を接続する必要があり
+0

どのオペレーティングシステムでですか? 'QThread'はどのように動いていますか?それぞれにイベントループがありますか? Linux上で –

+0

、私は多くの知識を持っていない何がボンネットの下で起こっている@BasileStarynkevitch –

+0

あなたの質問を編集して、コメントしないでください。 –

答えて

0

を終了/完了する必要があり、それはあなたのようです一度だけ行うとあなたのコードは私には少し混沌としています。

私が意味

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

した後、あなたはまた、あなたのケースで、私はMainWindow::on_deviceDetected()を考えて、あなたのワーカースレッドを終了スロットへの接続が必要ですか?

また、これは正確に何をする予定ですか? classは新しいクラスを作成します。その場合は、あなたが望むものではないかもしれません...

class newiDeviceDetect *deviceDetect; 
関連する問題

 関連する問題