Qt线程(1)
来源:互联网 发布:dxv解码器 for mac 编辑:程序博客网 时间:2024/06/04 19:53
在PictureBook Connector里初始使用的线程结构为
// SocketThread.hSocketThread : QThread{protected: virtual run();};// SocketThread.cppvoid SocketThread :: run(){ QTcpSocket tcpSocket; if(!tcpSocket.setSocketDescriptor(socketDescriptor)) { emit error(tcpSocket.error()); return; } // can't connect slot // connect(&tcpSocket, SIGNAL(disconnected()), this, SLOT(quit()), Qt::QueuedConnection); tcpSocket.moveToThread(this); while( !m_quit && tcpSocket.state() == QAbstractSocket::ConnectedState ) { // ... }}
因为需求的原因,需要将代码中的connect注释掉的代码打开,以使得在socket断掉的时候可以将thread退出。
但是却发现不能触发信号与槽,在一位同行的介绍下,在QtHelp里看了Multithreading Technologies in Qt。
我们可以看到在Permanent(无尽的)相关的介绍
- 最下面一行是C的写法,即在run函数里写while(true){…},里面明确写了不要在while里使用connect连接
- 在倒数第二行里,其写的用worker.moveToThread(thread);的写法,其可以将worker进行信号与槽的连接
- 倒数第三行这种用法还没有适应,暂时不考虑
so…我现在将我的socketThread里run函数里的code给封装成一个SocketWorker类。
- connect(pThread, SIGNAL(finished()), pThread, SLOT(deleteLater())); 1
- 然后在Socket断掉的时候,调用pThread.terminate()函数。
其现象非常有意思,感觉像是主线程被terminate掉的,但是UI没有断掉,只不过所有事件全部丢失。
把1中的connect代码去掉,则正常。
在进行Worker类进行设计时有两种思路:
- SocketWorker : QObject { QTcpSocket * m_pSocket; }
- SocketWorker: QTcpSocket
第一种在使用的时候,编译器报Warning,大体意思就是本地的Socket不能新建在与父线程不同的线程里,然后列出QTcpSocket 与SocketWorker的各自的ThreadId。
其结果是Socket第一次可以正常读写,第二次客户端发来的data就不能触发QTcpSocket::readyread信号。
根据我的分析应该是这样的情况:
SocketWorker->moveToThread(pThread);时QTcpSocket不是线程安全,而导致SocketWorker切换线程时,不能在其他线程触发事件。
第二种没有任何问题。
0 0
- Qt线程(1)
- Qt线程(QThread)
- QT学习(五)QT之多线程
- QT线程(一):线程类
- QT线程(二)---线程同步
- QT线程(一):线程类
- QT线程(二)---线程同步
- QT线程(一):线程类
- QT线程(二)---线程同步
- QT线程(一):线程类
- QT线程(二)---线程同步
- QT线程(一):线程类
- QT线程(二)---线程同步
- qt线程 qthread(转)
- Qt之线程(QThread)
- Qt之线程(QThread)
- Qt之多线程(三)
- Qt之多线程(四)
- Java synchronized (this) 的含义
- linux-常用命令
- ODDR
- Linux FHS标准文件系统学习笔记
- Docker
- Qt线程(1)
- Android6.0 Runtime Permission 动态权限
- ECSHOP登录自动退出问题解决
- 懒人爱家务_适配器(ArrayAdapter)
- 在messagebox()里回车换行
- 为什么要用回调函数?
- Error:Cause: org/gradle/api/publication/maven/internal/DefaultMavenFactory
- 【c/c++】list
- AutoLayout框架Masonry使用心得