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());
}