Laden...

Methode mit Verzögerung ausführen

Erstellt von EL_Broto vor 15 Jahren Letzter Beitrag vor 15 Jahren 5.815 Views
E
EL_Broto Themenstarter:in
55 Beiträge seit 2008
vor 15 Jahren
Methode mit Verzögerung ausführen

sorry, leute, ich steh grad total am schlauch 🙁
hab jetzt schon im forum, inner msdn und im wikibook gelesen, komm aber net weiter...
ich hab n thread, der quasi nur wartet, und dann eine methode aufrufen soll, nur weis ich nicht wie ich das bewerkstelligen soll oO

im thread selber darf ich das ja nicht aufrufen, weils ja sonst im thread lauft und ich das ja nicht will^^
pls help me

mfg EL_Broto

998 Beiträge seit 2007
vor 15 Jahren

Hehe, schau ins OpenBook da ist fast genau dein Problem beschrieben 🙂

Gruß David

3.430 Beiträge seit 2007
vor 15 Jahren

Hallo El_Broto,

ehrlich gesagt habe ich nicht verstanden was du machen willst.

Willst du einfach eine Methode in einem bestimmten Intervall aufrufen?
Wenn ja, dann sind die Timer was für dich.

Ansonsten musst du dein Problem wohl noch etwas genauer beschreiben.

Hehe, schau ins OpenBook da ist fast genau dein Problem beschrieben

Bist du dir da sicher 🙂

Gruss
Michael

E
EL_Broto Themenstarter:in
55 Beiträge seit 2008
vor 15 Jahren

naja, nicht direkt in einem Intervall, er soll bei einer bestimmten Situation(quasi keine Daten mehr verfügbar) etwas warten und dann eine bestimmte Methode aufrufen, die wiederum guckt, ob Daten verfügbar sind

998 Beiträge seit 2007
vor 15 Jahren

Bin jetzt nicht der Threadexperte, aber du könntest einen Thread ddoch in den Wartezustand versetzen und dann vom anderen Thread bei bedarf wieder aktivieren, damit sollte das doch gegessen sein.

Gruß David

E
EL_Broto Themenstarter:in
55 Beiträge seit 2008
vor 15 Jahren

Trotzdem, wenn das Thread.Sleep(bla) fertig ist, muss ich ja aus dem Thread irgendwas aus dem Main-Trhead aufrufen, seis ne Methode oder sonst was...
und da steh ich grad aufn schlauch 😠

3.430 Beiträge seit 2007
vor 15 Jahren

Hi,

Trotzdem, wenn das Thread.Sleep(bla) fertig ist, muss ich ja aus dem Thread irgendwas aus dem Main-Trhead aufrufen, seis ne Methode oder sonst was...
und da steh ich grad aufn schlauch

Hm, das hat mich jetzt noch mehr verwirrt.

Wenn du einfach eine Methode mit dem GUI-Thread aufrufen willst, dann hilft dir Control.Invoke bzw. BeginInvoke weiter.
Damit kannst du sicherstellen dass die Methode im GUI-Thread aufgerufen wird.

Siehe dazu [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke)

Gruss
Michael

998 Beiträge seit 2007
vor 15 Jahren

Du startest einen Thread in der methode X. In der Methode nimmst du eine Schleife und versetzt den Thread zu begin der Schleife in einen Wartezustand. Von Aussen kannst du den Thread nun aus dem Zustand rausholen und er durchläuft die Schleife jedes mal und versetzt sich zu Begin wieder in den Wartezustand.

Warum startest du eigentlich nicht jedes mal den Thread neu wenn nach Daten gesucht werden soll?

Gruß David

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo zusammen,

oben wurde es ja schon gesagt. Das ist ein Fall für einen (System.Windows.Forms.)Timer. Threads und Thread.Sleep und Invoke sind hier fehl am Platze.

herbivore

998 Beiträge seit 2007
vor 15 Jahren

Hmmm, aber er will es doch gar nicht periodisch haben?!?

Gruß David

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo DavidT,

das spricht doch nicht gegen einen Timer.

herbivore

998 Beiträge seit 2007
vor 15 Jahren

oh, sorry, ich meinte verzögert und nicht periodisch.

So wie ich das verstanden habe, möchte er, das der Thread bereits gestartet ist und dann auf ein Signal wartet, damit er seine "arbeit" aufnehmen soll, oder?

Gruß David

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo DavidT,

er soll bei einer bestimmten Situation [...] etwas warten und dann eine bestimmte Methode aufrufen

Gleichzeitig ist die Rede davon

im thread selber darf ich das ja nicht aufrufen, weils ja sonst im thread lauft und ich das ja nicht will^^

Das heißt für mich zusammen: An irgendeiner Stelle wird erkannt, dass nach einer bestimmten Zeit eine Aktion im GUI-Thread ausgeführt werden soll. Vielleicht interpretiere ich zu viel hinein, aber wenn ich richtig liege, bleibe ich bei meiner Empfehlung.

herbivore

296 Beiträge seit 2007
vor 15 Jahren

Schätze herbivore meinte sowas wie:

Pseudocode:



Timerintervall = 100;

timer_tick()
{
   if(keineDatenverfügbar)
      MeineMethodeAusführen();
}



998 Beiträge seit 2007
vor 15 Jahren

Was er meint ist mir schon klar, hatte nur die Problemstellung etwas anders verstanden 🙂

Gruß David

E
EL_Broto Themenstarter:in
55 Beiträge seit 2008
vor 15 Jahren

er, das bin ich (:D), will auf einen Link aufrufen und gewisse Links rausfiltern...
diese Links werden von Zeit zu Zeit generiert, wenn halt keine Links zur Verfügung stehen, hätt ich einen Thead erstellt, der einfach eine gewisse Zeit wartet und dann eine Methode aufruft, die wiederum guckt, ob Links vorhanden sind. Der Threadstart kann aber nicht nur aus einer Methode erfolgen(was eh relativ egal ist)

ich hoffe das war ausführlich genug

der post von Undertaker hilft mir auch nicht weiter, da ich den Timer ja auch anhalten können muss, fals daten vorhanden sind..

3.430 Beiträge seit 2007
vor 15 Jahren

Hallo El_Broto,

die Lösung für dein Problem wurde doch schon bereits genannt.
Verwende doch einfach einen Timer.

Diesen kannst du Starten und Stoppen wann du willst.
Und dieser schaut dir dan periodisch nach, ob neue Links vorhanden sind.

Gruss
Michae

E
EL_Broto Themenstarter:in
55 Beiträge seit 2008
vor 15 Jahren

ok danke, ist auch viel bequemer als mit threads und der ganzen invokerei^^

mfg EL_Broto

E
EL_Broto Themenstarter:in
55 Beiträge seit 2008
vor 15 Jahren

was ist an

timer.Tick += new EventHandler(Timer_Tick);

falsch? oO

VS2008 meint folgendes:

Fehler 1 Keine Überladung für "Timer_Tick" stimmt mit dem Delegaten "System.EventHandler" überein.

S
119 Beiträge seit 2008
vor 15 Jahren

Hi


timer.Tick += new EventHandler(Timer_Tick);

Das ist schon vollkommen richtig. Der Fehler ist das die Methode Timer_Tick nicht mit dem Delegate EventHandler übereinstimmt, oder auf deutsch:


void Timer_Tick(object sender, EventArgs e)
{

}

So muss die Methode aussehen

mfg
Sweet

/EDIT
Kleiner Tipp:

Wenn du ein Event abonnieren willst, z.B. beim Timer das Tick Event, dann schreib einfach:


timer.Tick+=

Dann drückst du 2 mal Tab und VS erstellt dir die Methode. Dann sollten solche Fehler wie deiner eben nicht mehr vorkommen ;D

"2 Dinge sind unendlich die Dummheit der Menschen und das Universum, aber beim Universum bin ich mir noch nicht so ganz sicher."

  • Albert Einstein
E
EL_Broto Themenstarter:in
55 Beiträge seit 2008
vor 15 Jahren

habs selbst grad gesehn, meine methode war falsch deklariert in der abstrakten Base-Klasse
man man man, ich muss echt mehr mit events in c# machen^^
aber jetzt hab ich das glaub ich einigermaßen durchblickt 🙂

thx nochmal

mfg EL_Broto