2010-11-28 2 views
0

У меня есть сервер, к которому могут подключаться несколько клиентов. Клиент является графическим интерфейсом, а сервер - командной строкой. Клиент имеет несколько функций (например, подключение и логин), которые при отправке на сервер должны получать ответ.Сеть без блокировки 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 я не знаю, что я делаю это правильно вещь.

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

+1

http://labs.qt.nokia.com/2010/06/17/youre-doing-it-wrong/ – smerlin 2010-11-28 23:08:43

+0

Да, я действительно нашел это и реализовал его, большинство моих проблем были решены благодаря этой статье: -) – Dave 2010-11-29 11:50:10

ответ

-1

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

Initialize это нравится:

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

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

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

+0

http://labs.qt.nokia.com/2010/06/17/youre-doing-it-wrong/ – smerlin 2010-11-28 23:09:27

2

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

Смежные вопросы