QT tcpsocket 在断开后重新连接程序直接崩溃

最近再写tcp程序时无意中碰到个问题,tcp客户端断开连接后再重新连接,发送数据直接报错:

 ASSERT: "m_buf" in file c:\users\qt\work\qt\qtbase\include\qtcore\5.9.1\qtcore\private\../../../../../src/corelib/io/qiodevice_p.h, line 116 


后来定位到发送数据write()函数上,经过调试后发现tcpsocket断开连接后直接触发信号槽重新连接.导致出错,如果手动重新连接则没事.

最后改了信号槽的连接方式就解决。

connect(this,SIGNAL(disconnected()),this,SLOT(connect_server()));
connect(this,SIGNAL(disconnected()),this,SLOT(connect_server()),Qt::QueuedConnection);
选择了
Qt::QueuedConnection模式
队列连接:内部通过postEvent实现的。不是实时调用的,槽函数永远在槽函数对象所在的线程中执行。如果信号参数是引用类型,则会另外复制一份的。
信号槽触发后并不是实时调用,给QT时间处理socket。

  • 8
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Qt中,连接断开数据库的操作可以通过`QSqlDatabase`类的成员函数来实现。下面是一个示例,演示了如何连接断开MySQL数据库,并在断开重新连接: ```cpp #include <QSqlDatabase> #include <QDebug> int main() { // 连接MySQL数据库 QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); db.setHostName("localhost"); db.setPort(3306); db.setDatabaseName("mydatabase"); db.setUserName("root"); db.setPassword("password"); if (!db.open()) { qDebug() << "无法打开数据库:" << db.lastError().text(); return -1; } qDebug() << "数据库已成功连接"; // 断开数据连接 db.close(); qDebug() << "数据库已断开连接"; // 重新连接数据库 if (db.open()) { qDebug() << "数据库已重新连接"; } else { qDebug() << "无法重新连接数据库:" << db.lastError().text(); return -1; } // 执行其他操作... db.close(); return 0; } ``` 在上面的示例中,我们使用`addDatabase()`函数添加了一个MySQL数据连接,并设置了相应的连接参数。然后,我们调用`open()`函数打开数据连接,如果连接成功,则输出"数据库已成功连接"。接下来,我们使用`close()`函数断开数据连接,并输出"数据库已断开连接"。最后,我们再次调用`open()`函数重新连接数据库,并根据返回值判断是否成功重新连接。 需要注意的是,当调用`close()`函数断开数据连接后,数据库相关的操作将无法执行。如果要重新连接数据库,需要再次调用`open()`函数。 希望这可以帮助到你。如果还有其他问题,请随时提问!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值