2017-01-27 11 views
0

Когда я испускать сигнал MainWindow от 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 работает отлично, но когда он подает сигнал killMe на MainWindow , Класс MainWindow поймать его делает ,, я должен закончить/прекратить newDeviceThread использовать его снова

Любой помощь Оценила, Thankyou

+0

В какой операционной системе? Как работает 'QThread'? У каждого из них есть цикл событий? –

+0

на Linux, у меня нет знаний, что происходит под капотом @BasileStarynkevitch –

+0

Пожалуйста, улучшите свой вопрос, отредактировав его, не комментируйте. –

ответ

0

Вам необходимо подключить сигнал для каждого нового потока вы создаете, вам кажется делайте это один раз, и ваш код выглядит немного хаотичным для меня.

Я имею в виду после того, как

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

Кроме того, необходимо подключить к слоту, который заканчивается ваш рабочий поток, в вашем случае я думаю MainWindow::on_deviceDetected()?

И что именно это должно делать? class создает новый класс и, возможно, это не то, что вы хотите в этом случае ...

class newiDeviceDetect *deviceDetect;