如何在不同的線程中執行QTcpSocket函數?如何在不同的線程中執行QTcpSocket?
回答
這裏是例子:
文件thread.h:
class Thread : public QThread {
Q_OBJECT
public:
Thread();
protected:
void run();
}
文件thread.cpp:
Thread::Thread() {}
void Thread::run() {
// do what ever you want with QTcpSocket
}
主
。 CPP或其他:
Thread *myThread = new Thread;
connect(myThread, SIGNAL(finished()), this, SLOT(on_myThread_finished()));
myThread->start();
爲所有調用設置一個QMutex
鎖,而不僅僅是在「不同」線程上,而是在所有線程上。一個簡單的方法,這樣做是通過QMutexLocker
[「**注:**該類中的所有函數都是可重入的]](http://qt-project.org/doc/qt-4.7/qtcpsocket.html)。如果您有更權威的來源來處理您的矛盾索賠,請包括這一點。 – MSalters 2015-01-14 12:45:04
你是對的。然而,(我想說的是)類不是線程安全的,重入只保證你可以在多個線程中使用類,如果你有不同的實例,但不同的'QTcpSocket'實例不能共享套接字描述符。此外,不管是否互斥,都無法從多個線程訪問「QTcpSocket」的單個實例。 – 2015-01-14 12:53:22
QT文檔明確指出QTCPSocket不應該跨線程使用。 I.E,在主線程中創建一個QTCPSocket,並將信號綁定到另一個線程中的對象。
我懷疑你正在實現類似於web服務器的東西,listen在listen上創建一個QTCPSocket。然後您需要另一個線程來處理處理該套接字的任務。你不能。
我對它的工作方式是將套接字保存在它出生的線程中。我爲該線程中的所有傳入數據提供服務,並將其投入到另一個線程可用於該數據的隊列中。
它在哪裏說的? – 2013-12-13 20:56:02
請參閱http://qt-project.org/doc/qt-4.7/qtcpserver.html#note-33 – 2013-12-13 21:07:13
該說明是由社區添加的,在我的經驗中是不正確的。你也可以通過傳遞套接字描述符來模擬行爲,因爲你最終會在同一個描述符上運行兩個'QTcpSocket'實例(服務器的隱式子節點和你在新線程中創建的實例)這會導致運行時斷言失敗。 – 2015-01-14 12:30:40
我在文檔中看到QTcpSocket不應該跨線程使用。如果你想在另一個線程中使用它Qt文檔說你應該在你的線程中創建一個新的QTcpSocket實例,並在新實例上設置描述符。爲此,您需要重新實現QTcpServer並使用QTcpServer::incomingConnection。一個簡單的例子是here。
- 1. 如何同時在兩個不同的線程中執行PyObject_CallObject()?
- 2. 如何在不同的線程中運行監聽器或在不同的線程中執行計算
- 3. 如何讓不同的OpenMP線程執行不同的任務
- 4. 在不同的線程執行回調
- 5. 如何讓不同的線程在CUDA中執行不同的部分?
- 6. 中斷處理程序在不同的線程中執行?
- 7. 在Java線程中執行同步
- 8. 如何在GWT中執行多線程?
- 9. 多線程執行不同任務
- 10. 線程同步 - 如何執行線程交替
- 11. 多線程同步執行
- 12. 線程不執行
- 13. 如何中斷執行程序線程
- 14. 在iOS中的不同線程上執行後臺任務
- 15. 在線程中執行不同的操作 - android
- 16. Hibernate Search在主線程中執行同步執行
- 17. 此代碼是否在與主UI線程不同的線程中執行
- 18. 如何在jmeter中以不同的任務分佈式執行線程?
- 19. 如何在不同內核上運行不同的線程?
- 20. C#:如何在不停止程序執行的情況下執行線程
- 21. 如何在等待在同一個線程上執行後繼續執行?
- 22. 如何在另一個線程組中執行線程組?
- 23. 線程任務不在IIS中執行
- 24. 如何在不同線程中同時運行多個QDialog?
- 25. 在同步塊內執行新線程
- 26. 如何在WPF中的不同線程中運行進度條?
- 27. 在Python中運行不同的線程
- 28. 在C中執行線程#
- 29. 在線程中執行malloc
- 30. 線程在Netty UDP服務器中不同時執行
這在很多層面上都是錯誤的。你甚至從來沒有嘗試將QTcpSocket移動到任何QThread應用程序的基本的新線程,此外,它不會工作,因爲QTcpSocket類不是線程安全的,並且具有內置的關聯性,如果你試圖從任何其他類中調用它(這將成爲你的QTcpServer運行的任何線程),那麼時間斷言失敗 – 2015-01-14 12:54:00