У меня есть сервер, к которому могут подключаться несколько клиентов. Клиент является графическим интерфейсом, а сервер - командной строкой. Клиент имеет несколько функций (например, подключение и логин), которые при отправке на сервер должны получать ответ.Сеть без блокировки ui в Qt 4.7
В основном мне нужно запустить функции QTcpSocket waitForConnection и waitForReadyRead. Однако мне нужно сделать это, не блокируя пользовательский интерфейс.
Что я думал о том, чтобы делать следующее: Имейте класс (Клиент), реализующий QThread, который выполняет все ожидания. Это создано в основном.
Client::Client (...)
{
moveToThread (this); // Not too sure what this does
mClient = new QTcpSocket (this);
start();
}
void Client::run (void)
{
exec();
}
void Client::connectToServer (...)
{
mClient->connectToHost (hostname, port);
bool status = mClient->waitForConnected (TIMEOUT);
emit connected (status);
}
void Client::login (...)
{
... Similar to connectToServer ...
}
Тогда GUI (например, ConnectToServerDialog) я запускаю это всякий раз, когда я готов сделать соединение. Я подключаю «подключенный сигнал» из потока к диалоговому окну, поэтому, когда я подключен или время ожидания соединения, оно будет излучать этот сигнал.
QMetaObject::invokeMethod (mClient, "connectToServer", Qt::QueuedConnection,
Q_ARG (const QString &, hostname), Q_ARG (quint16, port));
Я получаю отказ утверждать, с этим (не могу отправить события на объекты, принадлежащие другому потоку.) Так как я довольно новыми для Qt я не знаю, что я делаю это правильно вещь.
Может кто-нибудь сказать мне, что то, что я делаю, является хорошим подходом, и если да, то почему моя программа рушится?
http://labs.qt.nokia.com/2010/06/17/youre-doing-it-wrong/ – smerlin 2010-11-28 23:08:43
Да, я действительно нашел это и реализовал его, большинство моих проблем были решены благодаря этой статье: -) – Dave 2010-11-29 11:50:10