[VC++] Timer synchronisieren?

the incredible Leitman

Erfahrenes Mitglied
Hallo Leute!

Ich habe fogendes Problem:

In meiner Form existieren 3 Controls, die mittels Timer blinken. Jedoch starten sie, da der User sie aus und wieder einschalten kann, zu unterschiedlichen Zeitpunkten und blinken somit nicht synchron!

Wie kann ich das lösen, dass, unabhängig vom Startvorgang, sie immer zeitgleich aufblinken?

Ich denke mir, dass ich irgendwie die Systemzeit herausfinde (nur ob Sekunde gerade oder ungerade Zahl ist) und immer, wenn eine gerade Zahl => start blink! ...oder so ähnlich *gg*

In der MSDN finde ich nicht viel, wenn ich getSystemTime oder nur Time suche, hier im Forum erhalte ich auf Timer, synchron Anfrage null Ergenbisse und wenn ich nur Timer eingebe 500 Ergebnisse :p

Wär leiwand, wenn mir jemand einen kleinen Denkanstoss geben könnte,
oder einen anderen Lösungsweg,
oder Links, Referenzen, zusätzliche Informationen
oder eine andere Hilfestellung

...oder viel Geld :)

Grüße,
Leitman
 
Verwende nur einen einzigen Timer, der permanent läuft. Abhängig von der User-Aktion kannst du die Controls in der Timerfunktion entweder blinken lassen oder auch nicht.

Gruß
MCoder
 
hm... Könntest du mir das vielleicht bitte etwas genauer erläutern?

Hab jetzt auf gach ein Testprogramm geschrieben, das vom Prinzip her mein Programm simuliert (halt einfacher):

Code:
private: System::Void timer1_Tick(System::Object^  sender, System::EventArgs^  e) 
{
	// start blink
	blink();
}

private: System::Void blink()
 {
	// date = System::DateTime::Now;

	if (ellipse1_green == true)
	{
		System::Drawing::SolidBrush^ brush = gcnew System::Drawing::SolidBrush(Color::Gainsboro);
		System::Drawing::Graphics^ formGraphics;
		formGraphics = this->CreateGraphics();
		formGraphics->FillEllipse(brush, 12,12, 25,25);
		ellipse1_green = false;
	}
	else
	{
		System::Drawing::SolidBrush^ brush = gcnew System::Drawing::SolidBrush(Color::Green);
		System::Drawing::Graphics^ formGraphics;
		formGraphics = this->CreateGraphics();
		formGraphics->FillEllipse(brush, 12,12, 25,25);
		ellipse1_green = true;
	}

	if (ellipse2_active == true)
	{
		if (ellipse2_red == true)
		{
			System::Drawing::SolidBrush^ brush = gcnew System::Drawing::SolidBrush(Color::Gainsboro);
											System::Drawing::Graphics^ formGraphics;
			formGraphics = this->CreateGraphics();
			formGraphics->FillEllipse(brush, 62,12, 25,25);
			ellipse2_red = false;
		}
		else
		{									System::Drawing::SolidBrush^ brush = gcnew System::Drawing::SolidBrush(Color::Red);
			System::Drawing::Graphics^ formGraphics;
			formGraphics = this->CreateGraphics();
			formGraphics->FillEllipse(brush, 62,12, 25,25);
			ellipse2_red = true;
		}
	}

	if (ellipse3_active == true)
	{
		if (ellipse3_orange == true)
		{
			System::Drawing::SolidBrush^ brush = gcnew System::Drawing::SolidBrush(Color::Gainsboro);
			System::Drawing::Graphics^ formGraphics;
			formGraphics = this->CreateGraphics();
			formGraphics->FillEllipse(brush, 112,12, 25,25);
			ellipse3_orange = false;
		}
		else
		{
			System::Drawing::SolidBrush^ brush = gcnew System::Drawing::SolidBrush(Color::Orange);
			System::Drawing::Graphics^ formGraphics;
			formGraphics = this->CreateGraphics();
			formGraphics->FillEllipse(brush, 112,12, 25,25);
			ellipse3_orange = true;
		}
	}
}

private: System::Void button2_Click(System::Object^  sender, System::EventArgs^  e) 
{	
	date = System::DateTime::Now;

	if (ellipse2_active == false)
	{
		this->listBox1->Items->Add(Convert::ToString(date->Hour) + ":" + Convert::ToString(date->Minute) + ":" + Convert::ToString(date->Second) + " Led 2 an");
		this->button2->Text = "2 AUS";
		this->ellipse2_active = true;
	}
	else
	{			
		this->listBox1->Items->Add(Convert::ToString(date->Hour) + ":" + Convert::ToString(date->Minute) + ":" + Convert::ToString(date->Second) + " Led 2 aus");
		this->button2->Text = "2 AN";
		this->ellipse2_active = false;
	}
}

private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) 
{
	date = System::DateTime::Now;

	if (ellipse3_active == false)
	{
		this->listBox1->Items->Add(Convert::ToString(date->Hour) + ":" + Convert::ToString(date->Minute) + ":" + Convert::ToString(date->Second) + " Led 3 an");
		this->button1->Text = "3 AUS";
		this->ellipse3_active = true;
	}
	else
	{			
		this->listBox1->Items->Add(Convert::ToString(date->Hour) + ":" + Convert::ToString(date->Minute) + ":" + Convert::ToString(date->Second) + " Led 3 aus");
		this->button1->Text = "3 AN";
		this->ellipse3_active = false;
	}
}

Hab nun nur mehr einen Timer, mit dem ich alles steuer!
Trotzdem kann ich die Controls (hier Ellipsen) nocht abgleichen, sie blinken nun im selben Takt, aber gegengleich (wenn Ellipse 1 leuchtet, ist Ellipse 3 aus usw...)

Und außerdem ist das ziemlich viel Code oder?
hab voll den Durchblick verloren, seh mich nicht mehr raus :-(
 
Ich denke, das ist prinzipiell schon ok, wie du das jetzt gelöst hast. Du musst lediglich darauf achten, dass du während eines Timerlaufes immer die gleiche Aktion ausführst, also entweder alle Controls blinken (natürlich nur die, das das sollen) oder alle aus.

Das könntest du z.B. über eine statische Zustandsvariable lösen. Die einzelnen Ellipsenvariablen (z.B. this->ellipse2_active) solltest du nur dafür hernehmen, um zu steuern, ob überhaupt geblinkt werden soll. Deren Werte daher nur in den Click()-Funktionen setzen, aber nicht mehr bei blink() ändern.
C++:
private: System::Void blink()
{
    static bool bBlink = true;

    if( ellipse1_green == true && bBlink == true )
    {
        // ...
    }
    else
    {
        // ...
    }  
    
    // ...
    
    bBlink = !bBlink;
}
Gruß
MCoder
 
Danke!

Ich habe das jetzt so probiert, mitr einer zusätzlichen Zustandsvariable, aber das bringt gar keine Änderung ;)

Die einzelnen Ellipsenvariablen (z.B. this->ellipse2_active) solltest du nur dafür hernehmen, um zu steuern, ob überhaupt geblinkt werden soll. Deren Werte daher nur in den Click()-Funktionen setzen, aber nicht mehr bei blink() ändern.
ich ändere die Werte bei Blink ja gar nicht

Ich habe 2 Zustandsvariablen, die angeben, ob die Ellipse überhaupt blinken soll:
ellipse2_active, ellipse3_active
(ellipse 1 braucht keinen zustand, soll immer blinken, quasi als Referenz)

zusätzlich habe ich 3 Zustandsvariablen, die angeben, ob die Ellipse gerade Farbe hat oder nicht:
ellipse1_green, ellipse2_red, ellipse3_orange
 
leitman hat gesagt.:
ich ändere die Werte bei Blink ja gar nicht
Sorry, da habe ich nicht richtig hingeschaut. Eigentlich brauchst du nur eine einzige Zustandvariable für alle Objekte, weil du so am besten die Synchronität gewährleisten kannst. Außerdem wird der Code etwas kürzer :)
C++:
private: System::Void blink()
{
    static bool bBlink = true;

    System::Drawing::Graphics^ formGraphics;
    formGraphics = this->CreateGraphics();

    if( bBlink )
    {
        System::Drawing::SolidBrush^ brush = gcnew System::Drawing::SolidBrush(Color::Gainsboro);

        formGraphics->FillEllipse(brush, 12,12, 25,25);

        if (ellipse2_active == true)
        {
            formGraphics->FillEllipse(brush, 62,12, 25,25);
        }

        if (ellipse3_active == true)
        {
            formGraphics->FillEllipse(brush, 112,12, 25,25);
        }
    }
    else
    {
        System::Drawing::SolidBrush^ brush = gcnew System::Drawing::SolidBrush(Color::Green);
        formGraphics->FillEllipse(brush, 12,12, 25,25);

        brush = gcnew System::Drawing::SolidBrush(Color::Red);
        formGraphics->FillEllipse(brush, 62,12, 25,25);

        brush = gcnew System::Drawing::SolidBrush(Color::Orange);
        formGraphics->FillEllipse(brush, 112,12, 25,25);
    }

    bBlink = !bBlink;
}
Gruß
MCoder
 
Tut mir leid, dass ich mich erst jetzt melde, war am Wochenende in der Pampa, dort gibts keine Technologie :)

Danke Mann ;) funktioniert (fast) großartig, bis auf dass, das es verkehrt herum ist, (wenn ich mit den Buttons die Ellipsen ausschalte, leuchten sie) aber dass krieg ich alleine hin, Dankeschön für deine Hilfe,
vor allem ist es jetzt übersichtlicher, denn in meinem vollständigen Programm habe ich 15 dieser Ellipsen *gg*

c ya
mfG

der Leitman
 
Zurück