最近再寫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。