Zum Inhalt springen

Backgroundworker-Klasse einbinden


grey1987

Empfohlene Beiträge

Servus,

ich hab hier eine kleine DB-Anwendung, die mir einfach nur bestimmte Daten aus einer Datenbank in einem Windows-Form anzeigt.

Jetzt würde ich gerne, dass sich das Prog jede 5min aktualisiert und somit die Daten aktuell bleiben.

Da hab ich die Backgroundworder-Klasse gefunden, bzw. mir sagen lassen dass es sowas gibt und es hier einsetzbar ist.

BackgroundWorker-Klasse (System.ComponentModel)

ich bin leider noch ziemlicher Anfänger und hab leider nicht so die Ahnung wie ich das in meinen Quellcode einplanzen soll und vorallem wohin!?

Link zu diesem Kommentar
Auf anderen Seiten teilen

der timer ist eine komponente, welche in einem festgelegten intervall einen programmblock ausführt.

du suchst in deiner tooleiste, in der du buttons, textboxen etc findest nach der timer-komponente und ziehst sie normal aufs form (erscheint dann um unteren bildschirmrand). im eigenschaftenfenster der komponente gibt es die option "intervall". hier stellst du die zeit (in millisekunden) ein, nach welcher der timer loslaufen soll. wenn du als wert beispielsweise die 1000 einträgst, wird der timer alle 1000 millisekunden aufgerufen.

mit einem doppelklick auf die timer-komponente kommst du in dessen programmblock. wenn du für deine anzeige im formular eine methode geschrieben hast, kannst du diese jetzt einfach im timer-block aufrufen. schon wird die methode in dem von dir angegebenen intervall immer wieder aufgerufen.

Gruß

Die Lady

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke LadyPreis, hab jetzt so einen kleinen überblick wie das laufen soll.

ich hab jetzt wie beschrieben alles durchgeführt, jedoch scheint es nicht zu funkionieren.

ich hab eine Funktion loadQuery() welche ich aufrufe, wenn ich auf einen bestimmten Knopf drücke. und ab diesem Zeitpunkt soll die loadQuery() jede 5min aufgerufen werden.

muss ich nicht noch irgendwo angeben, wann der timer gestartet wird, oder legt er los, sobald das prog läuft?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Moin!

Von der Interval-Eigenschaft hat ja die Lady schon geschrieben.

Unter den Events gibt es dann den Event "Tick". Dieser springt an, wenn der Interval verstrichen ist. Wie die Ladz sagte, einfach doppelklick auf den Timer, oder den Tick unter den Events auswaehlen.

Um den Timer zu starten musst Du dann noch irgendwann mit der Methode Start() den Timer starten (z.B. MeinTimer.Start() ). Der Tick-Event wird nun so lange aufgerufen, bis Du die Methode Stop() des Timers aufrufst.

Link zu diesem Kommentar
Auf anderen Seiten teilen

also,

ich hab doppelklick auf den Timer gemacht und meine funktion loadQuery() reingemacht.


private: System::Void timer1_Tick(System::Object^  sender, System::EventArgs^  e) {

  loadQuery();

}


private: System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e) {

  //hier soll dann die Methode Start() rein!?

}

was kommt dann in die Methode Start() rein?

Link zu diesem Kommentar
Auf anderen Seiten teilen


private: System::Void timer1_Tick(System::Object^  sender, System::EventArgs^  e) 

{

  loadQuery();

}


private: System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e) 

{

  timer1.Start();

}

Ich habe Dir mal den Aufruf von Start eingefuegt. Nun sollte dann, in dem von dir gewaehlten Intervall, regelmaessig der Tick-Event aufgerufen werden.

So ein Timer ist schon eine feine Sache... :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

hab jetzt leider keine ide zur Hand, aber schau doch nochmal im Eigenschaften-Fenster für den Timer, ob es dort keine option "Enabled" (zumindest heisst sie in VB so) gibt. wenn man diese auf "true" setzt, läuft der Timer automatisch beim Start des Programms los.

Gruß

Die Lady

ja Funktioniert!

besser wäre es aber wenn ich das mit einem Knopf machen könnte.

ich weiß leider nicht was ich in eine Methode Start() reinpacken soll!?

Link zu diesem Kommentar
Auf anderen Seiten teilen

dann stell "enabled" wieder auf false.

im klick-ereigniss der buttons aktivierst du den timer einfach mit der anweisung

Timer1.Enabled = true;

dann wird der timer erst aktiviert, wenn du diesen button einmalig geklickt hast.

wenn du den timer durch diesen Button auch wieder deaktivieren willst, könnte das wie folgt aussehen:

if Timer1.Enabled

Timer1.Enabled = false;

else

Timer1.Enabled = true;

(so oder so ähnlich)

Ist es das, was du willst oder hab ich dein Problem nicht verstanden :confused:

Gruß

Die Lady

Bearbeitet von LadyPreis
Link zu diesem Kommentar
Auf anderen Seiten teilen

abgesehen davon, dass ich vc++ benutze (mein Fehler) klappt das wunderbar.

Ich danke euch!

hier meine Lösung:

private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {


	 if (this->timer1->Enabled) {

		 this->timer1->Enabled = false;

		 button1->Text = L"refresh on";

	 }


	 else {

		 this->timer1->Enabled = true;

		 button1->Text = L"refresh off";

	 }


 }

Gruss Grey

Link zu diesem Kommentar
Auf anderen Seiten teilen

selbst wenn die abfrage länger als 5 minuten dauert, kann man den timer auch so einstellen, dass er erst 5 minuten nach der letzten abfrage wieder beginnt...

Klar, aber dann würde deine Anwendung nicht reagieren während der Abfrage, das würde mit dem Backgroundworker der ja Multithreaded arbeitet nicht der Fall.

Link zu diesem Kommentar
Auf anderen Seiten teilen

die anwendung bleibt ja nicht im timer stehen, bzw man macht ja nicht im timer einen counter, der fünf minuten wartet:

ich stells mir eher so vor:

du holst dir die aktuelle uhrzeit und prüfst bei jedem timer zyklus einfach nach, ob seitdem fünf minuten vorbei sind...

die anwendung selbst bliebt daher nicht stehen

nachteil: ändert man im windows die uhrzeit, könnte man ein problem haben.

evtl macht man aber einen zweiten timer, der fünf minuten läuft und fragt den dann ab, dann hätte man keine probleme...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Darum geht es nicht, die GUI der Anwendung reagiert während der Abfrage nicht wenn die Datenbankabfrage im gleichen Thread läuft. Wenn die Abfrage lange dauert kann der User dein Eindruck bekommen die Abfrage wäre abgestürzt. Beim Backgroundworker wird automatisch der Threadpool verwendet, da passiert das nicht.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...