2009-06-25 6 views
1

Ich habe diese Frage gestern, da ich keine Daten empfangen wurde, aber seltsam, wenn ich warten in der destructor verwendet begann ich Benachrichtigung von QSocketNotifier receveing. Der Rest der Frage ist gleich. Kann jemand etwas vorschlagen? Ich habe eine Beispielanwendung erstellt, von der ein separater Thread gestartet wird, um Daten vom seriellen Port zu lesen und zu verarbeiten. QSocketNotifier wird verwendet, um festzustellen, ob Daten an den seriellen Ports angekommen sind oder nicht. Ich starte eine Ereignisschleife mit der Anweisung exec() in der Funktion run des Threads. Aber während die Anwendung nur ausgeführt wird, sobald der Socket-Notifier funktioniert hat, wird das Signal für die Aktivierung des seriellen Ports niemals erzeugt. Und sobald es erzeugt wurde, wurde es sehr schnell erzeugt und entsprach nicht der Bildfrequenz des sendenden Geräts.Probleme Serial Port-Uhr-Gewinde mit einer Ereignisschleife und QSocketNotifiers mit

Hier ist ein kurzes Code-Beispiel für die seriellen Kommunikator thread:

SerialPortWatchOne.cpp

//constructor 
klass::klass() 
{ 
//setport configuration 
//miscellaneous initialization 
QSocketNotifier* notifier = new QSocketNotifier(mPort->GetFileDescriptor, QSocketNotifier::Read,this); 
connect(notifier,SIGNAL(activated(int)),this,SLOT(ReadAndProcessData())); 
} 

void klass::run() 
{ 
exec(); //this starts an event loop where by Qt signal handling is enabled 
} 

void klass::ReadAndProcessData() 
{ 
     FlushBuf();  
     int bytes_read=mPort->ReadPort(mBuf,1000); 
     if(bytes_read>0) 
     //Process data 
} 

~klass::klass() 
{ 
//desctruction code; 
wait(); //so that thread cleanly releases all resources before exit 
} 

Anmerkung: Klass ist ein Thread und ein Mitglied des GUI-Thread und ist in dem GUI-Thread c‘instanziiert Tor. In regelmäßigen Abständen aktualisiert die GUI ihre Widgets mit Daten aus dem Klassenthread.

Kann jemand empfehlen, wie das, was das Problem ist? Hat jemand das schon mal gemacht.

+0

Sie scheinen eine Beschreibung des Problems zu fehlen. Gehen Sie nicht davon aus, dass die Leute Ihre vorherige Frage gelesen haben (oder wollen). Besser, diese Frage zu vervollständigen –

+0

Dies ist die genaue Frage, die ich gestern mit nur den ersten paar Zeilen gestellt habe, die ein Ergebnis meiner heute durchgeführten Arbeit waren. Wenn es etwas mehr gibt, was nicht klar ist, zeige es einfach an. Ich habe es von meiner Seite klar gemacht – rocknroll

Antwort

0

Nur daran denken, dass Sie QSocketNotifier * socketNotifier ohne eine Ereignisschleife im socketNotifier->thread() Thread verwenden. Wenn keine Ereignisschleife ausgeführt wird, erhalten Sie keine Ereignisbehandlung. Keine Ereignisbehandlung bedeutet, dass keine Signale von QSocketNotifier gesendet werden. Wenn Sie jedoch einen separaten Thread verwenden, möchten Sie möglicherweise trotzdem blockierende E/A-Aufrufe verwenden.

Verwandte Themen