Seite 1 von 1

Thread startet nur 1x von selbst nach [ERLEDIGT]

Verfasst: Do, 12. Apr 2012 15:11
von Manfred
Hi,

ich habe einen thread, den ich starte und nachdem er seine Pflicht erfüllt hat setze ich mit :setinterval(zeit) eine neue Startzeit. Das Ding ärgert mich nun, weil es nur 1x nach dem ersten Start von selbst wieder anläuft, danach nicht wieder. Wenn ich im Debugger nachsehe, ist aber zu sehen, dass das Interval gesetzt wurde. Irgendwelche Ideen, ohne den Quellcode gesehen zu haben?

Re: Thread startet nur 1x von selbst nach

Verfasst: Do, 12. Apr 2012 15:17
von Martin Altmann
Yup.
Reicht Dir als Antwort: Das geht so nicht! 8)
Schau mal in der Hilfe - da ist das explizit erwähnt.

Viele Grüße,
Martin

Re: Thread startet nur 1x von selbst nach

Verfasst: Do, 12. Apr 2012 15:20
von Martin Altmann
Alaska Hilfe zu :setStartTime() hat geschrieben:Wenn :setStartTime() und :setInterval() benutzt werden, sollte :setInterval() in :atStart() aufgerufen werden.

Re: Thread startet nur 1x von selbst nach

Verfasst: Do, 12. Apr 2012 15:31
von Manfred
Ich benutze keine :setstarttime(). Ich rufe das Dingen auf und danach setze ich das Interval neu. Dann läuft es noch 1x von selbst und dann nicht mehr.

Re: Thread startet nur 1x von selbst nach

Verfasst: Do, 12. Apr 2012 18:07
von Manfred
Vielleicht sieht ja jemand meinen Fehler?

grob skizziert

Code: Alles auswählen

LOCAL oThreadWacheMail := wache_mail():new()

oThreadWacheMail:start("wacheMail",oThreadWacheMail)

procedure wache_mail(oThread)

// hier steht der Code, der ausgeführt wird.
oThread:setInterval(oParameterExport:intmail*60*100)                   // neuen Wert setzen, falls die Parameter zwischendurch geändert wurden
return
kann das so überhaupt klappen?

Re: Thread startet nur 1x von selbst nach

Verfasst: Do, 12. Apr 2012 18:10
von Sören
Hallo Manfred,

probier mal das aus:

Code: Alles auswählen

oThread:setInterval( NIL )
oThread:setInterval( nNewInterval )

Re: Thread startet nur 1x von selbst nach

Verfasst: Do, 12. Apr 2012 18:34
von Manfred
Habe ich als erstes probiert, bringt auch nichts.

Re: Thread startet nur 1x von selbst nach

Verfasst: Do, 12. Apr 2012 19:17
von AUGE_OHR
Manfred hat geschrieben:

Code: Alles auswählen

LOCAL oThreadWacheMail := wache_mail():new()
oThreadWacheMail:start("wacheMail",oThreadWacheMail)

procedure wache_mail(oThread)
// hier steht der Code, der ausgeführt wird.
oThread:setInterval(oParameterExport:intmail*60*100)                   // neuen Wert setzen, falls die Parameter zwischendurch geändert wurden
return
kann das so überhaupt klappen?
ich würde sagen : NEIN
IMHO muss ein o:setInterval() VOR der o:Start() gesetzt werden. siehe C:\ALASKA\XPPW32\Source\COMPAT\timer.prg

Re: Thread startet nur 1x von selbst nach

Verfasst: Do, 12. Apr 2012 19:22
von Manfred
OK,

hatte ich auch schon. Klappt aber trotzdem nicht.

Re: Thread startet nur 1x von selbst nach

Verfasst: Do, 12. Apr 2012 19:27
von AUGE_OHR
Manfred hat geschrieben:hatte ich auch schon. Klappt aber trotzdem nicht.
hast du den "alten" Thread versucht zu benutzten oder ihn "neu" angelegt ?

Re: Thread startet nur 1x von selbst nach

Verfasst: Do, 12. Apr 2012 19:32
von Manfred
Hm,

ich denke mal, dass ich den immer wieder benutzen möchte. Also er wird einmal mit Start angeworfen. Dann durchläuft er seine Arbeit und direkt danach wird setinterval() neu gesetzt, oder nochmal, je nachdem ob sich der Wert für die zeit geändert hat oder nicht. In der Hoffnung, dass er dann nach dem (neuen) Intervall wieder startet. das macht er aber nicht andauernd, sondern immer nur 1x beim Start direkt. Arbeitet seine Funktion ab, bekommt wieder setinterval() gesetzt und soll dann warten, um dann wieder loszulaufen.

Re: Thread startet nur 1x von selbst nach

Verfasst: Do, 12. Apr 2012 19:43
von Manfred
Boh ey,

wie komm ich mir denn vor? Wo steht geschrieben, dass man setinterval() nur setzen darf, wenn man das Intervall auch wirklich ändern will? Ich habe da nichts zu gelesen. Ist vielleicht jemand hier, der bessere Augen hat? Also, es klappt. Aber nur wenn man Setinterval() setzt, wenn sich der Wert geändert hat.
Man setzt also vor dem Start einmal das Interval und dann nur noch, wenn es sich ändern soll. Also eine Art Bestätigung darf nicht sein.

Re: Thread startet nur 1x von selbst nach [ERLEDIGT]

Verfasst: Do, 09. Aug 2012 7:32
von brandelh
Wenn du immer bestätigst, dass der nächste Start in einigen ms eintreten soll, verschiebst du diesen doch oder ;-)

Re: Thread startet nur 1x von selbst nach [ERLEDIGT]

Verfasst: Do, 09. Aug 2012 7:37
von Manfred
Bitte etwas genauer Hubert, ich kann Dir so früh nicht folgen. :oops:

Re: Thread startet nur 1x von selbst nach [ERLEDIGT]

Verfasst: Do, 09. Aug 2012 8:01
von brandelh
Na bei jedem :setInterval( nWert ) wird doch der nächste Start auf nWert/100 Sekunden verschoben.
Wenn du nun vor 20/100 Sekunden die 100 gesetzt hast, müsste in 80/100 Sekunden der nächste Start sein.
Du "bestätigst" nun aber mit einem :setInterval( nWert ), wenn nWert auch heruntergezählt wird, könnte das noch funktionieren,
ich denke aber dass dies nicht der Fall ist und dann verschiebst du den nächsten Start wieder auf nWert/100 Sekunden.

Das ist wie mit den Aufträgen an Kinder oder Ehemänner ... "mach ich gleich ..." kommt auch nie was dabei raus :D

Re: Thread startet nur 1x von selbst nach [ERLEDIGT]

Verfasst: Do, 09. Aug 2012 8:07
von Manfred
Wieso?

Ich starte den Thread, er arbeitet sein Ding ab und ich setze danach das Interval neu.

Wenn ich Dich richtig verstanden habe, denkst Du ich erhöhe mit jedem Setzen das Intervall? Oder verschiebe es? Verstehe ich nicht. Die Aufgabe wird erfüllt und dann sage ich ihm, wann die nächsten Kohlen aus dem Keller holen soll. Und nicht bevor die letzten Kohlen geholt wurden.

Re: Thread startet nur 1x von selbst nach [ERLEDIGT]

Verfasst: Do, 09. Aug 2012 8:28
von brandelh
ich verstehe was du meinst und hatte dein Beispiel nicht richtig gelesen.
Mein Beispiel zeigt, dass er nach dem 2. "Verlängern" den code nicht mehr ausführt, aber atEnd() auch nicht ausführt.
Irgendwie hängt er im Wartezustand ...

Code: Alles auswählen


PROCEDURE Main
   LOCAL oThread := NIL
   LOCAL nInterval := 100 // jede Sekunde ein Durchgang
   LOCAL cName, cVorname
   CLS
   @ 1,1 say "Threadtestprogramm wartet auf Eingaben"
   cName := cVorname := space(50)
   oThread := Thread():new()
   oThread:setInterval(nInterval)
   oThread:atStart := {|| DispOutAt( 7, 30, "Thread: "+ntrim(ThreadID())+" => Time(): "+time()+" ist gestartet" ) }
   oThread:atEnd   := {|| DispOutAt( 8, 30, "Thread: "+ntrim(ThreadID())+" => Time(): "+time()+" endet" ) }
   oThread:start( "Anzeige" )

   @ 2,1 say "MAIN ThreadID()="+str(ThreadID())
   @ 10,10 SAY "Nachname"  GET cName
   @ 12,10 SAY " Vorname"  GET cVorName
   READ

   oThread:setInterval( NIL)  // wenn dieses fehlt, wird (zumindest bei mir) NICHT in :atEnd aufgeräumt.

   @ 22,10 SAY " Ende in 10 Sekunde oder nach Tastendruck "

   inkey(10)

   RETURN

   PROCEDURE Anzeige
      local oT := ThreadObject(), nCount := oT:startCount
      DispOutAt( 2, 30, "Thread: "+ntrim(ThreadID())+" => Time(): "+time()+" Lauf: "+ntrim(nCount,5)+"         " )
      do case
         case nCount <= 5
              // OK
         case nCount > 5 .and. nCount < 15
              DispOutAt( 4, 50, "Jetzt 200 ..."+time() )
              oT:setInterval(200)
         otherwise
              DispOutAt( 4, 50, "Jetzt NIL    "+time() )
              oT:setInterval(NIL)
      end
   RETURN
   function ntrim(n);return alltrim(str(n))