Seite 1 von 1

Problem bei Buttonabfrage

Verfasst: 16. September 2004 08:35
von littlepeoplegirl79
Hallo,

ich gebe ein Videostream an ein Label aus.
Das ganze passiert soweit in einer Schleife, welche durch
den bool-Werte für button-toggled(bool) gesetzt wird.
Jedoch läßt sich diese Schleife nicht mehr anhalten?

Code: Alles auswählen

//im Konstruktor

connect( start_bto, SIGNAL( toggled(bool) ), this, SLOT( frameGrabbing_Slot(bool) ) );

Code: Alles auswählen

void ARBlueBox::frameGrabbing_Slot( bool stop )
{
	while(stop)
	{

		m_frameGrabber.Grab32BitFrame();

		dataPtr = (unsigned char*)m_frameGrabber.GetBuffer();


		if(dataPtr!=0)
		{
			QImage img(frame_xsize, frame_ysize, 32, 0); 

			int idx = 0;
			for (int i = 0; i < frame_ysize; ++i) {
				QRgb *line = (QRgb*)img.scanLine(i);

				for (int j = 0; j < frame_xsize; ++j) {
				line[j] = qRgba(dataPtr[idx + 2], dataPtr[idx + 1], dataPtr[idx], dataPtr[idx + 3]);
				idx += 4; // für RGBA hier += 4
				}
			}
			bitBlt(videoplane, 0, 0, &img);
		}
	}
}
Müßte er nicht abbrechen, wenn ich den Button erneut drücke?

Gruß und Dank

Verfasst: 16. September 2004 09:37
von pm_Snake
Nein, weil soweit dürfte er eigentlich garnicht kommen weil er noch in der Endlosschleife hängt. Prüfe irgendwo in der Schleife ob die Arbeit getan ist und setze dann stop

Verfasst: 16. September 2004 09:47
von littlepeoplegirl79
ich wollte die Schleife eigentlich so lange laufen lassen bis der Button wieder gedrückt wurde.
Hatte dafür auch schon in der Schleife nochmal ein connect eingebaut, hatte aber nicht funktioniert.
Kann ich in der Schleife irgnedwie auf den Event vom Button warten?

Verfasst: 16. September 2004 09:59
von pm_Snake
Warum bis der Knopf gedrückt wurde? Was tut dein Programm? Hast du nicht ne andere Bedingung ausser Button nochmal zu drücken? Geht sicher irgendwie, aber ne andere Methode wäre vlt besser. Ist das Bild das gezeichnet wird nicht irgnedwann fertig?

Verfasst: 16. September 2004 10:11
von littlepeoplegirl79
Das Livevideo soll eigentlich die ganze Zeit, jeden Frame, neu gezeichnet werden. Ich könnte noch einen anderen Button zum stoppen nehmen.

Würde es eigentlich auch gehen, das Video einmal zu zeichnen und dann nur noch den Inhalt aktualisieren?

Verfasst: 16. September 2004 10:13
von pm_Snake
Sry, beim Thema Videos mit Qt bin ich nicht fit.
Du könntest aber, evtl ( weiss nicht ob das wegen der Endlosschleife geht ) per Buttonclick eine Membervariable umsetzen die du in der Zeichnungsschleife abfragst, vlt klappt das....

Verfasst: 16. September 2004 10:39
von john
oder Du erstellst einen zweiten Prozess (Thread), der dann den Button überwacht und die Schleife stopt, in dem dass der zweite Thread ein Stop-Byte setzt (das natürlich in der Schleife abgefragt wird)...

Verfasst: 16. September 2004 10:42
von littlepeoplegirl79
ich hatte in der while schleife schon eine connect Abfrage, aber das half nicht, oder meintest du etwas anderes?

Verfasst: 16. September 2004 14:56
von lepsai
Hmmm...


Die Lösung:

void ArBlueBox::showOneFrame()
{
hier ohne while und stop NUR einen Frame anzeigen
}

dann:
void ARBlueBox::frameGrabbing_Slot( bool stop )
{
if(stop)
m_pCaptureTimer->stop();
else
// start capturing timer with 25 frames/sec:
m_pCaptureTimer->start( 40, FALSE );
}

im Konstruktor von ARBlueBox:

m_pCaptureTimer = new QTimer( this);
connect( m_pCaptureTimer, SIGNAL(timeout()), this, SLOT(showOneFrame()) );

Verfasst: 16. September 2004 15:16
von littlepeoplegirl79
danke, funktioniert perfekt!
:D