使用Qt編寫跨平臺應用程序(包括帶有MinGW的Windows)。爲了從SSL套接字讀取數據,我創建了一個單獨的線程。此線程出於歷史原因,因爲此前的應用程序是使用C socket/ssl/crypto庫編寫的。現在所有這些都被Qt網絡庫所取代。可以使用`waitForReadyRead()`而不是爲`readyRead()`信號創建一個插槽嗎?
對於阻塞線程,waitForReadyRead(milliseconds)
似乎是一個更好的選擇。現在,根據Qt的層次:
QIODevice
|
QAbstractSocket
|
QTcpSocket
|
QSslSocket
的QAbscractSocket::waitForReadyRead()
文檔建議:
注:該功能可以隨機失敗在Windows上。如果您的軟件將在Windows上運行,請考慮使用事件循環和readyRead()信號。
但是類似的警告是沒有在QIODevice::waitForReadyRead()
中提到。
問題:是否QSslSocket::waitForReadyRead()
始終可用於所有平臺?
爲什麼我不能用readyRead()信號?
由於一些奇怪的原因,如果我插入一些readyRead()方法,那麼它不會被調用。此外,QSslSocket :: write()也不起作用,否則以上述方式起作用。由於我的代碼複雜,我無法在此處顯示。
您聲明您正在使用線程。如果'readyRead'發射器和接收器在不同的線程上,你確定接收器的線程有一個活動的事件循環?順便說一句,我不禁覺得使用'waitForReadyRead'只會暫時掩蓋真正潛在問題的症狀。 –
@ G.M。最初只有1個線程可以進行TLS連接並與服務器交換一對自定義消息(讀寫)。只有在這種情況下,我纔會開始一個新的循環來實現獨家閱讀目的。對於'readyRead()',我確信必須從我身邊編碼/理解錯誤而不讓它工作。但是,如果我必須使用'waitFor ...()'方法,那麼我目前的設計就可以自行完成。唯一的擔心是它的Windows實施。另一個較小的問題是,有時Qt'readyRead()會在多個連續的數據消息之後發出。 'socket-select()'在這裏更快。 – iammilind