Qt + Threading + C Bibliothek (libftdi/libusb)



  • Hallo Forum,

    frohes neues Jahr und folgendes Problem:

    Ich schreibe an einem kleinen Programm, was mit Qt einen Dialog anzeigt und nach Klick auf einen Knopf mit einem USB-Gerät kommuniziert (über libftdi, was eine C-Bibliothek ist, die auf libusb aufbaut). Das geschieht folgendermaßen:

    • Der Konstruktor der Dialog-Klasse initialisiert die C-Bibliothek mittels Funktionsaufrufs, dabei wird ein Zeiger auf eine Struktur übergeben, die alle Informationen für die späteren Aufrufe bereithält.
    • In einem Slot wird nun die Struktur weiterverwendet, die Zeiger in der Struktur sind jedoch anscheinend ungültig, weil der Slot in einem anderen Thread aufgerufen wird (?).

    Im Quelltext sieht das ungefähr so aus:

    // Hier ist der Konstruktor, in dem Punkt 1. geschieht
    Beispiel11::Beispiel11(QWidget* parent)
    : QDialog(parent)
    {
    	setupUi(this);
    
    	connect(testButton, SIGNAL(clicked()), this, SLOT(testSynchronousBitBang()));
    
    	// Bibliothek initialisieren und den Kontext speichern
    	// (context ist Member dieser Klasse)
    	ftdi_init(&context);
    
    	// ...
    }
    
    // ...
    
    // Hier werden jetzt weitere Funktion der Bibliothek verwendet,
    // aber in einem anderen Thread (diese Methode hier ist ein Qt-Slot)
    void Beispiel11::testSynchronousBitBang()
    {
    	int value;
    
    	// Beachte: context wurde im Konstruktor gesetzt
    	if ((value = ftdi_set_baudrate(&context, 300)) < 0)
    	{
    		// Fehler anzeigen
    	}
    }
    

    Wie löse ich nun das Problem ? In anderen Foren habe ich gelesen, das libusb angeblich nicht Thread-sicher wäre, könnte das das Problem sein ? Theoretisch könnte ich alle Aufrufe in die Methode verlagern, wo sie gebraucht würden, dass wäre jedoch sehr umständlich und unästhetisch ...



  • Qt 3 oder 4?



  • Folgende Versionen:

    • Qt 4.4.2
    • libusb 0.1.12
    • libftdi 0.12


  • die Zeiger in der Struktur sind jedoch anscheinend ungültig, weil der Slot in einem anderen Thread aufgerufen wird

    Wenn Du mit Qt4 einen Slot aus einem anderen Thread ausloest, wird lediglich ein Event an den Thread geschickt, der Slot also erst aus seinem eigenen Thread heraus ausgefuehrt - da duerfte dein Problem also nicht herruehren.



  • Was ich vergessen habe zu schreiben:

    Wenn ich die Initialisierungsroutinen (das was im Konstruktor steht) in den SLOT reinschreibe, dann funktionierts ...


Anmelden zum Antworten