关于跨线程操作的心得

来源:互联网 发布:pr文艺小清新调色数据 编辑:程序博客网 时间:2024/06/11 08:14

背景:创建线程是为了把任务量大的事情交给线程去做,防止因为主线程(GUI线程)执行逻辑代码产生卡顿造成用户体验不好的现象。

这样子就会涉及主线程和子线程的通信问题。

子线程包括了逻辑子线程和GUI子线程,一般来说因为GUI子线程有自己的触发事件,跟主线程交互的情况比较少,所以就不讨论了,这里就单单说下逻辑子线程。

一般子线程要传递数据或者调用主线程的函数,都会使用信号SIGNAL。
在子线程对象被创造出来的时候

    m_SMU = new SMUThread();    //子线程对象被创建    connect(m_SMU,SIGNAL(sendString(QString)),this,SLOT(Auxiliary_information(QString)));//信号槽绑定子线程,捕捉sendString事件,来触发Auxiliary_information()函数

然后再

emit sendString(str);   //子线程中发射信号

这就是子线程对主线程的交互。

那么好了,主线程该如何跟子线程进行交互呢?例如我想点击主线程来触发子线程发送数据。

一开始我是直接用子线程对象来调用子线程函数

m_SMU->SendRecv(0,buf,sizeof(buf),0);//主线程直接调用m_SMU线程下的SendRecv函数

然后bingo,功能实现出来了,然后把上述代码放入botton点击事件中去,想调用几次就点击几次,然后就报错了。。

QSocketNotifier: Socket notifiers cannot be enabled or disabled from another thread

大概意思是不能够跨线程调用。。

然后我就在想,当初是通过信号来触发主线程函数,反过来可不可以呢?

当然可以,但是你要知道怎么写。

主线程里面创建对象时

m_SMU = new SMUThread(this); //把主线程的指针传进去

子线程的逻辑里面写一个connect

this->connect(parent,SIGNAL(sendString(QString)),this,SLOT(test()));//parent 是 主线程指针,用于监听主线程的信号 来触发test()函数。

然后系统又报错了。。。
QObject::moveToThread: Cannot move objects with a parent

意思是说,调用moveToThread必须要

m_SMU = new SMUThread();  //不能传入任何东西  指针必须要为0

难道主线程调用子线程真就这么难?

还有一个办法,在主线程里写一个connect

connect(ui->pushButton_4,SIGNAL(clicked(bool)),m_SMU,SLOT(test()));//获取botton点击事件来调用子线程的函数

本人刚学QT不久,如果有好的线程交互希望能留言给个方向或者关键字,谢谢大家了

原创粉丝点击