Я пишу клиент для приложения клиент/сервер. Клиенты должны войти в систему, используя окно входа в систему. Если вход успешно завершен, появляется окно ожидания (это только окно, содержащее метку). На стороне сервера есть барьер, ожидающий входа в систему n клиентов; когда это происходит, сообщение транслируется, ожидается, что окно ожидания закрывается, и для каждого клиента появляется новое окно.Qt создает диалоговое окно, ожидающее сетевого события
Сетевой интерфейс реализован мной, используя низкоуровневые функции, а не функциональность, предоставляемую Qt.
Фактический цикл ожидания что-то вроде этого:
char buffer[256];
while (strcmp(buffer, "proceed"))
read(sockfd, buffer, 256);
Проблема заключается в том, что если я начну этот цикл в основном потоке, блоки приложений, по понятным причинам.
Как я могу сделать этот цикл запущенным, а не заблокировать приложение, и закрыть диалоговое окно, когда оно закончится?
Позже изменения: я также попытаться использовать объекты QThread, но по причинам, которые я еще не до конца понимаю, приложение по-прежнему падает:
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 –
реализовать рабочий объект с этой функциональностью и запустить в отдельном потоке. когда вы получаете сообщение, просто выпустите сигнал от рабочего объекта, который вы можете подключить к слоту «закрыть()» в диалоговом окне. – ramtheconqueror
@ramtheconqueror Теперь у вас есть две проблемы, а не одна. Нитки не являются универсальным средством. –