У меня есть сервер, к которому могут подключаться несколько клиентов. Клиент - это графический интерфейс, а сервер - командная строка. У клиента есть несколько функций (например, подключение и вход в систему), которые при отправке на сервер должны получить ответ.
В основном мне нужно запустить функции QTcpSocket waitForConnection и waitForReadyRead. Однако мне нужно сделать это, не блокируя пользовательский интерфейс.
Я думал сделать следующее: иметь класс (клиент), реализующий QThread, который выполняет все ожидания. Это создается в main.
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 ...
}
Затем графический интерфейс (например, ConnectToServerDialog), который я запускаю всякий раз, когда готов установить соединение. Я подключаю «подключенный сигнал» из потока к диалогу, поэтому, когда я подключен или время ожидания соединения истекло, он будет излучать этот сигнал.
QMetaObject::invokeMethod (mClient, "connectToServer", Qt::QueuedConnection,
Q_ARG (const QString &, hostname), Q_ARG (quint16, port));
Я получаю ошибку утверждения с этим (не могу отправлять события объектам, принадлежащим другому потоку). Поскольку я довольно новичок в Qt, я не знаю, правильно ли я делаю.
Может ли кто-нибудь сказать мне, является ли то, что я делаю, хорошим подходом, и если да, то почему моя программа падает?