当客户端断开后调用connectToHost重连服务器成功后调用write发送数据会导致程序奔溃,找了好久最后发现是信号和槽连接方式有问题。
原来是:
cpp
connect(this->electricBoxSocketClient,&QTcpSocket::disconnected,this,
[=]()
{
emit deviceErrorSignal(0,true,true,"连接断开");
});
修改为:
c
connect(this->electricBoxSocketClient,&QTcpSocket::disconnected,this,
[=]()
{
emit deviceErrorSignal(0,true,true,"连接断开");
},Qt::QueuedConnection);
就合适了。
将disconnected
信号与槽的连接方式改为Qt::QueuedConnection
。
Qt::QueuedConnection
连接方式介绍:
在Qt中,Qt::QueuedConnection是一种信号与槽的连接方式,它指示信号与槽之间的通信通过事件队列进行,即发送信号的对象会将信号发送到事件队列中,然后由事件循环来处理并调用槽函数。
使用Qt::QueuedConnection时,信号发出时不会直接调用连接的槽函数,而是将一个事件放入接收者对象的事件队列中。在事件循环中处理事件时,会依次调用事件队列中的槽函数。
这种连接方式主要用于不同线程间的通信,因为Qt的跨线程通信是通过事件分发机制实现的。Qt::QueuedConnection还可以用于线程内部的通信,以确保信号与槽的调用都在事件循环中进行,避免了多线程并发访问的问题。
需要注意的是,Qt::QueuedConnection并不保证信号和槽函数的执行顺序,因为它们是在不同的事件循环中执行的。如果需要保证执行顺序,可以考虑使用Qt::BlockingQueuedConnection连接方式。
使用Qt::QueuedConnection的语法如下:
cpp
connect(sender, &Sender::signal, receiver, &Receiver::slot, Qt::QueuedConnection);
其中,sender
是发送信号的对象,signal
是发送的信号,receiver
是接收信号的对象,slot
是接收信号的槽函数。最后一个参数Qt::QueuedConnection
表示使用Qt::QueuedConnection连接方式。