我正在開發一個聊天程序,其中客戶端是單線程的,但服務器將爲每個連接的客戶端啓動一個新線程。我相信我的客戶端代碼是穩定的,但服務器讓我感到困惑。如何從QThread啓動GUI窗口?
現在,我有一個派生的QTcpSocket
類查找傳入連接,當它看到一個,開始一個新的QThread
。當QThread
運行時,它會創建一個QMainWindow
(它是聊天窗口)的實例並顯示它。
void secureserver::incomingConnection(int socketDescriptor)
{
securethread *thread = new securethread(socketDescriptor, this);
connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
thread->start();
}
void securethread::run()
{
serverwindow myServerWindow;
myServerWindow.setSocketDescriptor(mySocket);
myServerWindow.show();
}
我已經得到錯誤stderror像下面,和QMainWindow
永遠不會出現這樣聊着在這一點上是不可能的。
QObject: Cannot create children for a parent that is in a different thread.
(Parent is QApplication(0xbf9e5358), parent's thread is QThread(0x98a54f0), current thread is securethread(0x99e9250)
QPixmap: It is not safe to use pixmaps outside the GUI thread
我的問題是:
- 我需要做的
QThread
的QMainWindow
父母? - 我是以完全錯誤的方式去談論這個嗎?
- 任何其他一般的想法,爲什麼這不工作,因爲我期望它 或如何解決它將不勝感激。
我很困惑,爲什麼你的服務器有任何GUI代碼在所有。在我看來,你的客戶端應該是顯示聊天窗口的客戶端,而服務器應該是純粹的將消息從一個客戶端傳遞到另一個客戶端的機制。 – Chris
這個想法是,你有許多客戶端,一臺服務器(一個本地IP地址和端口),但服務器爲每個傳入連接創建一個新線程。然後,服務器可以在每個窗口中僅有一個客戶端進行通信,但它可以同時在這些新線程/窗口中發送/接收,因爲它們將處於其自己的線程中。我沒有設計這個程序的規格,所以我和你一起問爲什麼。 – J2N