Threadproblem mit qextserialport
Verfasst: 25. Mai 2007 11:57
Hallo!
Der obere Code klappt, der scheinbar identische Code unten klappt nicht. Es ist reiner Debugcode, also nicht "sauber" (File wird nicht geschlossen) und nicht optimiert (ein Zeichen Buffer). Trotzdem entsteht im oberen Beispiel eine Datei, die Zeichen für Zeichen alles aufschreibt, was auf der seriellen Schnittstelle reinkommt.
Nun der Code, der nicht klappt, weil der Vergleich comport->bytesAvailable() immer unwahr endet. Außerdem sehe ich im Debugger nicht, dass er den Haltepunkt jemals erneut anfährt. Bricht er denn die Ausführung von run() danach ab!?
Hat jemand eine Idee, warum plötzlich keine Bytes mehr ankommen? Die Datei entsteht, aber bleibt vollkommen leer.
Grüße!
Der obere Code klappt, der scheinbar identische Code unten klappt nicht. Es ist reiner Debugcode, also nicht "sauber" (File wird nicht geschlossen) und nicht optimiert (ein Zeichen Buffer). Trotzdem entsteht im oberen Beispiel eine Datei, die Zeichen für Zeichen alles aufschreibt, was auf der seriellen Schnittstelle reinkommt.
Code: Alles auswählen
// abstractCommunicationClass stammt von QThread ab!
class serialPort : public abstractCommunicationClass
{
Q_OBJECT
private:
QextSerialPort* comport;
public:
serialPort(); // <-- Initialisierung und Öffnen von comport drin!
~serialPort(); // <-- Schließen des comport
void run();
void testfn();
};
void serialPort::testfn(void)
{
QFile file("serial_debug.txt");
if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
return;
QTextStream out(&file);
out << "Starting output\n";
forever
{
// Lesen von Zeichen in den Ringpuffer, wenn notwendig
if (comport->bytesAvailable() > 0)
{
char c;
comport->read(&c, 1); // TODO: Fehlerabfrage
out << c;
out.flush();
}
}
file.close(); // Natürlich wird diese Zeile nie ausgeführt
}
// in der Main dann
serialPort* com = new serialPort();
((serialPort*)(com))->testfn(); // Typcast zur Sicherheit
// Resultat: Klappt
Code: Alles auswählen
// Klasse wie oben
void serialPort::run(void)
{
QFile file("serial.txt");
if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
return;
QTextStream out(&file);
out << "Starting output\n";
while (true)
{
// Prüfen, ob Thread beendet werden soll
stoppedLock.lockForRead();
if (stopped)
break;
stoppedLock.unlock();
if (comport->bytesAvailable() > 0) // ist immer falsch -- warum!?
{
char c;
comport->read(&c, 1); // TODO: Fehlerabfrage
out << c;
out.flush();
}
}
file.close();
stoppedLock.unlock();
}
// Aufruf durch
serialPort* com = new serialPort();
((serialPort*)(com))->start(); // Typcast zur Sicherheit
Grüße!