QTcpSocket übersieht Pakete
Verfasst: 20. Dezember 2012 15:46
Hallo,
ich schreibe gerade mein erstes Programm mit Qt (unter Windows 7).
Es soll folgendes tun: jedes TCP-Paket, das auf einem bestimmten Port empfangen wird, soll in ein QTableWidget gepeichert werden.
Das funktioniert auch so wie es soll. Es kommen pro Sekunde nur 10 Pakete mit je etwa 100 Byte.
Aber: sobald man das Programmfenster minimiert und maximiert, oder einen QFileDialog öffnet, "übersieht" der QTcpSocket auf einmal ankommende Pakete. Sprich, es wird kein Signal readyRead() ausgesandt. Ich habe dies überprüft, indem im entsprechenden Slot eine qDebug() Ausgabe generiert wird, die dann leider bei einigen Paketen ausbleibt.
Muss man den Socket grundsätzlich in einen QThread packen, damit er jedes Paket empfangen kann? Ich dachte immer, dass alle TCP-Daten vom Betriebssystem gepuffert werden.
Hier mal ein Codeausschnitt, der die Beziehungen meiner Klassen zeigt:
Mir ist auch aufgefallen, dass bei der Registrierung der Signal/Slots NUR Qt::QueuedConnection funktioniert. Bei allen anderen Methoden (Qt::AutoConnection usw...) werden viele Pakete mit der Länge Null empfangen. Mache ich irgendetwas grundsätzlich falsch? Ich habe mich an das Beispiel Fortune Client Example auf qt-project.org gehalten.
ich schreibe gerade mein erstes Programm mit Qt (unter Windows 7).
Es soll folgendes tun: jedes TCP-Paket, das auf einem bestimmten Port empfangen wird, soll in ein QTableWidget gepeichert werden.
Das funktioniert auch so wie es soll. Es kommen pro Sekunde nur 10 Pakete mit je etwa 100 Byte.
Aber: sobald man das Programmfenster minimiert und maximiert, oder einen QFileDialog öffnet, "übersieht" der QTcpSocket auf einmal ankommende Pakete. Sprich, es wird kein Signal readyRead() ausgesandt. Ich habe dies überprüft, indem im entsprechenden Slot eine qDebug() Ausgabe generiert wird, die dann leider bei einigen Paketen ausbleibt.
Muss man den Socket grundsätzlich in einen QThread packen, damit er jedes Paket empfangen kann? Ich dachte immer, dass alle TCP-Daten vom Betriebssystem gepuffert werden.
Hier mal ein Codeausschnitt, der die Beziehungen meiner Klassen zeigt:
Code: Alles auswählen
//cStarter.cpp
cStarter::cStarter(int argc, char *argv[]){
pMainScreen = new cMainScreen;
pSocket = new QTcpSocket;
pDataManager = new cDataManager;
connect(pSocket, SIGNAL(readyRead()), this, SLOT(slotWriteReceivedTcpToDataManager()), Qt::QueuedConnection);
(...)
}
void cStarter::slotWriteReceivedTcpToDataManager(){
pDataManager->mGetReceivedBytes(pSocket->readAll());
}