Multithreading QMainWindow未捕获来自QThread的信号

Multithreading QMainWindow未捕获来自QThread的信号,multithreading,qt,c++11,thread-safety,qt4,Multithreading,Qt,C++11,Thread Safety,Qt4,当我从运行在不同线程中的QObject向MainWindow发出信号时,为什么MainThread无法捕获它,我使用的是Ubuntu 16.04 有时它会捕获,但仅在线程继续在事件循环中运行之后发生一次, 我只想完成线程,如果一些工作已经完成,然后我必须重用它 class主窗口:公共QMainWindow { Q_对象 公众: 显式主窗口(QWidget*parent=0); ~main窗口(); 类newidevicedtect*设备检测; 私人: Ui::MainWindow*Ui; 公众时

当我从运行在不同线程中的QObject向MainWindow发出信号时,为什么MainThread无法捕获它,我使用的是Ubuntu 16.04 有时它会捕获,但仅在线程继续在事件循环中运行之后发生一次, 我只想完成线程,如果一些工作已经完成,然后我必须重用它

class主窗口:公共QMainWindow
{
Q_对象
公众:
显式主窗口(QWidget*parent=0);
~main窗口();
类newidevicedtect*设备检测;
私人:
Ui::MainWindow*Ui;
公众时段:
在_deviceDetected()上无效;
};
类newidevicedtect:公共QObject
{
Q_对象
公众:
显式newiDeviceDetect(QObject*parent=0);
QThread*newDeviceThread;
信号:
无效的killMe();
公众时段:
void threadWorker();
};
MainWindow*mainClass;
静态无效USBHOTPLUGDETECHAND(内部信号)
{
qDebug()usbHotPlugDetect();
}
主窗口::主窗口(QWidget*父窗口):
QMainWindow(父级),
用户界面(新用户界面::主窗口)
{
用户界面->设置用户界面(此);
mainClass=这个;
deviceDetect=新的newiDeviceDetect;
连接(deviceDetect,信号(killMe()),此,插槽(在_deviceDetect()上);
信号(SIGUSR1、USBHotplugDetectThand);
连接(此,信号(usbHotPlugDetect()),此,插槽(在usbHotPlugDetect()上);
}
MainWindow::~MainWindow()
{
删除用户界面;
}
void main window::on_usbhotpluggettect()
{
deviceDetect->threadLock.lock();
deviceDetect->newDeviceThread->start();
}
void main window::在_deviceDetected()上
{
deviceDetect->newDeviceThread->terminate();
deviceDetect->newDeviceThread->wait();
deviceDetect->threadLock.unlock();
}
Newidevicedtect::Newidevicedtect(QObject*父对象):QObject(父对象)
{
newDeviceThread=新的QThread;
connect(newDeviceThread,SIGNAL(started()),this,SLOT(threadWorker());
移动到线程(newDeviceThread);
//一些工作
}
void newiDeviceDetect::threadWorker()
{
睡眠(5);
//一些工作
基尔梅();
}
在我的代码中,threadWorker工作正常,但当它向MainWindow发送信号killMe时,MainWindow类无法捕获它,我必须完成/终止newDeviceThread才能再次使用它

谢谢你的帮助


你需要为你创建的每个新线程连接信号,看起来你只做了一次,你的代码在我看来有点混乱

我是说以后

newDeviceThread = new QThread;
connect(newDeviceThread,SIGNAL(started()),this,SLOT(threadWorker()));
您还需要连接到终止工作线程的插槽,在您的情况下,我认为
MainWindow::on\u deviceDetected()

这到底应该做什么<代码>类创建一个新类,在这种情况下,这可能不是您想要的

class newiDeviceDetect *deviceDetect;

在哪个操作系统上?
QThread
如何运行?他们每个人都有自己的事件循环吗?在Linux上,我不太了解引擎盖下发生了什么@basilestarynkevitch请通过编辑来改进你的问题,不要评论它。正如Basile所说,你的问题没有明确说明你是如何开始这个线程的。大概您有一个对newDeviceThread->start()的调用;在//somework部分。我怀疑它不会工作,因为您的工作线程没有事件循环。快速搜索“没有事件循环的qt信号”会得到一个答案,说你需要一个事件循环。。。
class newiDeviceDetect *deviceDetect;