Вопрос

У меня есть сервер, к которому могут подключаться несколько клиентов. Клиент - это графический интерфейс, а сервер - командная строка. У клиента есть несколько функций (например, Connect и Login), которые, когда отправляются на сервер, должны получить ответ.

По сути, мне нужно запустить функции Qtcpocket Waitfornnection и 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 ...
}

Затем графический интерфейс (например, ConnectToServerdialog) Я запускаю это всякий раз, когда готов подключиться. Я подключаю «подключенный сигнал» из потока к диалогу, поэтому, когда я подключен или подключен к подключению, он испускает этот сигнал.

QMetaObject::invokeMethod (mClient, "connectToServer", Qt::QueuedConnection,
    Q_ARG (const QString &, hostname), Q_ARG (quint16, port));

Я получаю отказ от ассуда с этим (не могу отправлять события на объекты, принадлежащие другому потоку.) Так как я достаточно новичок в Qt, я не знаю, если я делаю правильную вещь.

Кто-нибудь может сказать мне, если что я делаю, это хороший подход, и если так, почему моя программа сбивается?

Это было полезно?

Решение

Я не рекомендую запустить нить в конструкторе.

Инициализируйте это как:

Client * client = new Client();
client->moveToThread(client);
client->start();

Или если вы не хотите использовать такое решение, добавьте в конструктор перед start(); линия this->moveToThread(this);

UPD: Извините, я впервые не видел, что у вас есть эта строка.

Другие советы

Лучшее - никогда не вызывать методы, такие как Waitforblah () ... заставляя цикл события ждать неопределенного периода, введет возможность замораживания графического интерфейса за это время. Вместо этого подключите свой сигнал QTCPSocket подключенного () к некоторым слоту, который будет обновлять ваш графический интерфейс, и позвольте циклом события продолжаться как обычно. Сделайте свой подключенный материал в этом слоте.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top