Domanda

Ho un server a cui più client possono connettersi a. Il cliente è GUI mentre il server è la linea di comando. Il cliente ha diverse funzioni (ad esempio, di connessione e di accesso) che, una volta inviato al server dovrebbe ricevere una risposta.

Fondamentalmente ho bisogno di eseguire le funzioni QTcpSocket waitForConnection e waitForReadyRead. Tuttavia, ho bisogno di fare questo senza bloccare l'interfaccia utente.

Quello che ho pensato di fare è stata la seguente: Avere una classe (Client) implementare QThread che fa tutto l'attesa. Questo è stato creato nel principale.

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

Poi la GUI (ad esempio, ConnectToServerDialog) ho eseguito questo ogni volta che io sono pronto a fare una connessione. Collego il "segnale collegato" dal filo alla finestra di dialogo in modo che quando mi sono connesso o connessione scaduta emetterà questo segnale.

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

sto ottenendo un errore affermare con questo (Non è possibile inviare gli eventi a oggetti di proprietà di un thread diverso.) Dato che io sono abbastanza nuovo per Qt non so se quello che sto facendo è la cosa giusta.

Qualcuno può dirmi se quello che sto facendo è un approccio buono e se sì perché è il mio programma crash?

È stato utile?

Soluzione

Non consiglio d'inizio della discussione nel costruttore.

inizializzarlo come:

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

Se non si desidera utilizzare tale soluzione, aggiungere nel costruttore prima linea start(); this->moveToThread(this);

UPD: mi dispiace, non mi ha visto in un primo tempo, di avere questa stringa

.

Altri suggerimenti

La cosa migliore non è mai a metodi di chiamata come waitForBlah () ... costringendo il ciclo degli eventi di aspettare per un indeterminato periodo introduce la possibilità della GUI congelamento durante quel tempo. Invece, collegare il segnale del vostro QTcpSocket collegato () ad alcuni slot che aggiornerà la vostra interfaccia grafica a seconda dei casi, e lasciare che il ciclo degli eventi continuare come al solito. Fate la vostra roba on-collegato dentro quello slot.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top