Pregunta

Tengo un servidor en el que varios clientes pueden conectarse. El cliente es GUI mientras que el servidor es la línea de comandos. El cliente tiene varias funciones (como la conexión y de inicio de sesión) que, cuando se envía al servidor debe recibir una respuesta.

Básicamente se necesita para ejecutar las funciones QTcpSocket waitForConnection y waitForReadyRead. Sin embargo, tengo que hacer esto sin bloquear la interfaz de usuario.

Lo que se me ocurrió hacer fue el siguiente: Tiene una clase (Cliente) implementar QThread la que hace toda la espera. Esto se crea en principal.

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 ...
}

A continuación, la interfaz gráfica de usuario (por ejemplo, ConnectToServerDialog) que ejecuta este cuando estoy listo para hacer una conexión. Conecto la "señal conectada" de la rosca para el cuadro de diálogo de modo que cuando estoy conectado o tiempo de conexión agotado emitirá esta señal.

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

Me estoy haciendo un fallo afirmar con esto (No se puede enviar eventos a objetos propiedad de un hilo diferente.) Puesto que soy bastante nuevo en Qt no sé si lo que estoy haciendo es lo correcto.

Puede alguien decirme si lo que estoy haciendo es una aproximación buena y si es así ¿por qué mi programa de estrellarse?

¿Fue útil?

Solución

No recomiendo rosca de entrada en el constructor.

inicializarlo como:

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

O si usted no desea utilizar dicha solución, añadir en el constructor antes start(); línea this->moveToThread(this);

UPD: lo siento, no me vio en un primer momento, que usted tiene esta cadena

.

Otros consejos

Lo mejor es nunca a llamar a métodos como waitForBlah (...) forzando el bucle de eventos que esperar un periodo indeterminado introduce la posibilidad de que la interfaz gráfica de congelación durante ese tiempo. En su lugar, conecte la señal conectada de su QTcpSocket () para algunas ranuras que actualizar su interfaz gráfica de usuario según sea apropiado, y dejar que el bucle de eventos continuará como de costumbre. Hacer sus cosas en el interior de ese espacio conectado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top