Question

J'ai un serveur auquel plusieurs clients peuvent se connecter. Le client est l'interface graphique alors que le serveur est en ligne de commande. Le client dispose de plusieurs fonctions (par exemple connexion et connexion) qui, lorsqu'il est envoyé au serveur doit recevoir une réponse.

En fait je dois exécuter les fonctions QTcpSocket waitForConnection et waitForReadyRead. Cependant, je dois le faire sans bloquer l'interface utilisateur.

Ce que je pensais de faire était le suivant: Avoir une classe (Client) mettre en œuvre QThread qui fait tout l'attente. Ceci est créé dans le 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 ...
}

Ensuite, l'interface graphique (par exemple, ConnectToServerDialog) Je lance ce à chaque fois que je suis prêt à établir une connexion. Connecter le « signal connecté » du fil à la boîte de dialogue quand je suis connecté ou la connexion a expiré, il émet ce signal.

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

Je reçois un échec assert avec ce (ne peut pas envoyer des événements à des objets appartenant à un autre thread.) Depuis que je suis assez nouveau pour Qt Je ne sais pas si ce que je fais est la chose correcte.

Quelqu'un peut-il me dire si ce que je fais est une bonne approche et si oui, pourquoi est mon plantage du programme?

Était-ce utile?

La solution

Je ne recommande pas fil de départ dans le constructeur.

Initialiser comme:

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

Ou si vous ne voulez pas utiliser cette solution, ajouter dans le constructeur avant la ligne de start(); this->moveToThread(this);

màj: désolé, je n'ai pas vu à la première fois que vous avez cette chaîne

.

Autres conseils

La meilleure chose est de ne jamais appeler des méthodes comme waitForBlah () ... forcer la boucle d'événement à attendre pour une période indéterminée introduit la possibilité de l'interface graphique le gel pendant cette période. Au lieu de cela, connectez votre signal connecté () de QTcpSocket à une fente qui mettra à jour votre interface graphique, selon le cas, et que la boucle d'événements continue comme d'habitude. Faites vos trucs sur-connecté dans cet emplacement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top