标题:Qt TcpSocket多线程诡异问题求解...
作者:a289672082
日期:2016-05-16 06:29
内容:
#include
#include "QGridLayout"
#include "QVBOXlAYOUT"
#include "QPushButton"
#include "QLineEdit"
#include "Qlabel"
#include
#include
#include
#include
#include
#include "mythread.h"
class MyWindow : public QWidget
{
Q_OBJECT
public:
QTcpServer* server;
MyWindow(QWidget *parent = 0);
~MyWindow();
QPushButton *btn;
QLabel* label;
QLineEdit* edit;
QVBoxLayout* Vbox;
QGridLayout* grid;
signals:
void mainwrite(QString);
public slots:
void On_TestBtn_Cliked();
voidacceptConnection();
};
MyWindow::MyWindow(QWidget *parent)
: QWidget(parent)
{
label = new QLabel(QStringLiteral(""));
btn= new QPushButton("send");
edit = new QLineEdit();
grid = new QGridLayout();
grid->addWidget(edit,0,0);
grid->addWidget(btn,0,1);
Vbox = new QVBoxLayout();
Vbox->addLayout(grid);
Vbox->addWidget(label);
setLayout(Vbox);
fuc1 fu = std::bind(&MyWindow::On_TestBtn_Cliked, this);
connect(btn, &QPushButton::clicked, this, fu);
server = new QTcpServer(this);
&nbs ..
#1 [lemonzll 05-16 08:37]
代码我没试过,有点问题,MyWork里面socket的parent没有设置,调用moveToThread的时候socket没有切换到其他线程,你在writeSlot里面调用write的时候socket就跨线程调用了,这样会有警告。还有就是MyWork里面你不要这样根据线程描述符重建socket,直接还用原来的socket就可以
#2 [jxgyzhang 05-16 09:49]
楼上说的对你也可以把socket也移动到新的线程中去
socket = NULL;
m_socketid = socketid;
m_thread = new QThread();
socket = new QTcpSocket();
socket->setSocketDescriptor(this->m_socketid);
connect(socket, SIGNAL(readyRead()), this, SLOT(readClient()), Qt::DirectConnection);
socket ->moveToThread(m_thread);
this->moveToThread(m_thread);
m_thread->start();
#3 回 lemonzll 的帖子 [a289672082 05-16 12:04]
lemonzll:代码我没试过,有点问题,MyWork里面socket的parent没有设置,调用moveToThread的时候socket没有切换到其他线程,你在writeSlot里面调用write的时候socket就跨线程调用了,这样会有警告。还有就是MyWork里面你不要这样根据线程描述符重建socket,直接还用原来的socket就可以 (2016-05-16 08:37)
谢谢我现在试试
#4 回 jxgyzhang 的帖子 [a289672082 05-16 12:05]
jxgyzhang:楼上说的对你也可以把socket也移动到新的线程中去
socket = NULL;
m_socketid = socketid;
m_thread = new QThread();
socket = new QTcpSocket();
....... (2016-05-16 09:49)
谢谢我现在去试试
#5 [a289672082 05-16 12:11]
@jxgyzhang@lemonzll两位问题解决了是socket没有指定parent.
代码改成:
m_thread = new QThread();
socket = new QTcpSocket(this);
socket->setSocketDescriptor(this->m_socketid);
就没问题了
总结:moveToThread,要小心,不能跨线程的对象不指定parent也属于跨线程操作