思路:为了实现热插拔(即插即用),我们肯定要实时的监控我们的主线程,所以就想到了用子线程来监控,这样就不会把主线程拖死,我们在子线程里不断的检测,当满足条件时,我们将信号发出,告诉主线程,我已经准备好了,主线程就可以执行一些操作。
实现:怎么创建线程这些的,网上很多,这里主要将怎么实现这个功能。
- 在子线程中定义好自己要发出的信号,这里不便不说,不会的百度很多。
signals: void sendStart(); void sendStop();
- 在run函数中,将你的信号发出,中的emit就是发出信号的关键
int j = 0, z = 0; //控制开关闭的次数的变量
while (true)
{
pause.lock();
if (gigeCameraM->getCameraNum() <= 0)
{
textLabelM->setText(QString::fromLocal8Bit("相机不存在"));
if (z != 0) //关闭一次之后就只可以在打开
{
gigeCameraM->quit(); //相机不存在时,先停止线程
emit sendStop(); //发出停止信号
z = 0;
j = 0;
}
i++;
}
else
{
textLabelM->setText(QString::fromLocal8Bit("相机存在"));
if (i != 0 || j <= 1) //当第一次运行或中间拔出过相机就进入
{
emit sendStart(); //发出开始信号
j++;
i = 0;
z++;
}
}
pause.unlock();
msleep(40);
}
3.主线程中接收信号,用conntect接收子线程传出的信号,注:一定好先实例化出来再用connect,在开启线程,conntect中的第五个参数一定要有,要不然无法连接槽和信号。可以参考:
槽和信号无法连接的解决办法
cameraTestThread = new CameraTest(ui->cameraStateS, gigeCameraM/*, ui->SerialNumber*/); //实例化监控线程
connect(cameraTestThread, SIGNAL(sendStart()), this, SLOT(threadStartOperation()),Qt::DirectConnection);//接受开始信号
connect(cameraTestThread, SIGNAL(sendStop()), this, SLOT(threadStopOperation()), Qt::DirectConnection);//接受停止信号
cameraTestThread->start(); //启动
4.实现connect中的threadStartOperation()与threadStopOperation()函数。
void SampleView::threadStartOperation() //当线程发出开始操作时,调用开始操作函数
{
ui->SerialNumber->addItems(gigeCameraM->getSerialNumber());
gigeCameraM->openCamera(ui->SerialNumber->currentText());//获取当前选择的相机序列号
gigeCameraM->start();//启动进程
}
void SampleView::threadStopOperation() //当线程发出停止操作时,调用停止操作函数
{
ui->SerialNumber->clear();
gigeCameraM->closeCamera();
}
5.到这里就结束了,其中还有些关于工业相机的一些知识和实现,由你们慢慢去挖掘。