Button während eines Funktionsaufrufs sperren

Verschiedenes zu Qt
Antworten
martin2_86
Beiträge: 17
Registriert: 20. März 2010 00:29

Button während eines Funktionsaufrufs sperren

Beitrag von martin2_86 »

Hallo,

ich programmiere Qt 4.6 in Microsoft Visual Studio 2008. Meine Applikation besteht hauptsächlich aus zwei programmen: einer GUI, programmiert mit Qt und einem AD-Wandler programm, das auf eine PCI Karte zugreift. Das AD-Wandeln kann dabei per knopfdruck gestartet werden:

Code: Alles auswählen

connect(m_button_startCapturing,SIGNAL (clicked()), this, SLOT(startCapturing()));


void MainWindow::startCapturing()
{
	// Apply all Settings
	applySettingsToADCapture();

        ...

	// Start Capturing
	adcapture();

        ...
}

Die Funktion "adcapture" kann nun 1 bis 60 sekunden dauern. Während dieser Zeit reagiert die GUI nicht auf weiter Signale, doch diese werden gespeichert und danach ausgeführt. Wenn z.b. während des capturing Vorgangs der "start" button gedrückt wird, wird der slot danach gleich nochmal ausgeführt. Um dies zu verhindern will ich den knopf irgendwie sperren für die Zeit, die das AD Capture Programm. Wenn ich jedoch den slot wie folgt programmiere:

Code: Alles auswählen

connect(m_button_startCapturing,SIGNAL (clicked()), this, SLOT(startCapturing()));


void MainWindow::startCapturing()
{
       m_button_startCapturing->setEnabled(FALSE);

	// Apply all Settings
	applySettingsToADCapture();

        ...

	// Start Capturing
	adcapture();

        ...
        m_button_startCapturing->setEnabled(FALSE);
}
funktioniert das leider nicht, weil das disabeln anscheinend erst nach dem slot ausgeführt werden würde, und dann überschrieben wird. Hat jemand eine Idee, wie man das lösen könnte?

Gruß und Danke im Voraus,

Martin
RavenIV
Beiträge: 267
Registriert: 21. Januar 2009 14:24
Wohnort: Waldshut

Beitrag von RavenIV »

Ein Schubser in die richtige Richtung:
Die Arbeitsfunktion "adcapture" als Thread auslagern, per Signal anstossen. Dann arbeitet die GUI weiter.

Für weitere Info:
Forensuche oder Qt-Hilfe.
Linux, das längste Text-Adventure aller Zeiten
martin2_86
Beiträge: 17
Registriert: 20. März 2010 00:29

Beitrag von martin2_86 »

Hi,

danke fuer den Tipp. Hab die Funktion jetzt ausgelagert in nen eigenen Thread

Code: Alles auswählen

QFuture<void> future = QtConcurrent::run(adcapture);
jetzt laeuft die Oberflaeche weiter waehrend des capturing. Mit dem future-watcher hab ich mir nun n signal erzeugt, das ich mit nem Slot verbunden habe, der aufgerufen wird wenn der Thread beendet ist. Genau was ich wollte! Super, danke nochmals fuer deine Hilfe.

Gruss Martin
RavenIV
Beiträge: 267
Registriert: 21. Januar 2009 14:24
Wohnort: Waldshut

Beitrag von RavenIV »

martin2_86 hat geschrieben: Genau was ich wollte! Super, danke nochmals fuer deine Hilfe.
Gern geschehen.
Und da helfe ich doch mit Freude wieder, bei so einer netten Bedankung. ;-)
Linux, das längste Text-Adventure aller Zeiten
Antworten