我正在爲客戶端/服務器應用程序編寫客戶端。客戶端應該使用登錄窗口進行登錄。如果登錄成功,將出現「等待」窗口(這只是一個包含標籤的窗口)。在服務器端有一個障礙,等待n個客戶端登錄;當發生這種情況時,廣播一條消息,等待窗口應該關閉,併爲每個客戶端出現一個新窗口。Qt創建一個等待網絡事件的對話框
網絡接口由我使用低級函數實現,而不是由Qt提供的功能。
實際等待循環是這樣的:
char buffer[256];
while (strcmp(buffer, "proceed"))
read(sockfd, buffer, 256);
的問題是,如果我開始這個循環在主線程,應用程序會阻止,原因是顯而易見的。
如何讓此循環運行並且不阻止應用程序,並在結束時關閉對話框?
後來編輯:我也嘗試使用QThreads,但是,對於原因,我不完全理解的是,應用程序仍然崩潰:
class WaitLoop : public QThread {
public:
WaitLoop(NetworkHandler &network) : network(network) {}
private :
NetworkHandler &network;
void run() {
this->network.waitForGameStart();
}
};
在等待對話框構造函數:
WaitLoop *waitLoop = new WaitLoop(network);
connect(waitLoop, SIGNAL(finished()), this, SLOT(gameStartSlot()));
waitLoop->start();
應用程序仍然使用這種方法崩潰。
也許一個進度對話框可以工作; http://doc.qt.io/qt-4.8/qprogressdialog.html –
實現具有此功能的工作對象並在單獨的線程中運行。當您收到該消息時,只需從工作對象發出一個信號,您可以連接到該對話框的「close()」插槽。 – ramtheconqueror
@ramtheconqueror現在你有兩個問題,而不是一個。線程不是普遍的補救措施。 –