Ich möchte eine Funktion ausführen (lade_etwas()), die eine längere Zeit (ca. 30s) läuft. Dabei soll das Skript aber weiter laufen.
Wie mache ich das, ohne dass das Skript einfriert?
Es wird immer getestet (etwas_geladen()) ob obige Funktion gestartet ist, dann soll man z.B. auf einen Knopf innerhalb von 15s drücken, damit etwas gesendet wird (sende_etwas()).
Wenn die man den Knopf drückt oder die Zeit abläuft soll die oben genannte Funktion wieder gestartet werde.
Dafür habe ich einen Timer verwendet, ist das soweit ok?
Dann möchte ich noch, dass alle 10s etwas anderes abgefragt wird (frage_ab()).
Das auch wieder mit einem Timer, macht das Sinn?
Hier meine Beispiel Fkt.
#include <GuiConstantsEx.au3>
global $bLadeEtwas
lade_etwas()
[/autoit] [autoit][/autoit] [autoit]GUICreate("titel", -1, -1, 100, 100)
$b_start = GUICtrlCreateButton("Starten", 10, 10, 80, 30)
gui()
[/autoit] [autoit][/autoit] [autoit]; die Funktionen
[/autoit] [autoit][/autoit] [autoit]func lade_etwas()
; etwas das ca. 30s am Stück läuft, Ergebniss gibt es erst, wenn es fertig ist
$bLadeEtwas = true
;sleep(3000)
endfunc
func etwas_geladen()
; testen ob lade_etwas() schon geladen hat
if $bLadeEtwas = true then
return true
else
return false
endif
endfunc
func sende_etwas()
; einfach etwas senden oder speichern
endfunc
func frage_ab()
; frage etwas ab
endfunc
func gui()
local $bGeladen = false, $iTimer = TimerInit(), $iZeit = TimerInit(), $iZeit2 = 0
GUISetState(@SW_SHOW)
while true
switch GUIGetMsg()
case $GUI_EVENT_CLOSE
exit
case $b_start
if $bGeladen = true then
sende_etwas()
$bGeladen = false
$iZeit2 = 0
lade_etwas() ; neustarten
MsgBox(0, "", "sende_etwas!")
else
MsgBox(0, "", "Tue nichts")
endif
endswitch
; alle 10s etwas abfragen
if Mod(TimerDiff($iTimer), 10*1000) < 1000 then
; kleiner als 100, weil man nie genau die Milisekunde trifft
frage_ab()
endif
; wenn etwas_geladen() = false testen, bis true
if $bGeladen = false then
$bGeladen = etwas_geladen()
endif
if $bGeladen = true then
; neue Zeit setzen, wenn neues true
if $iZeit2 = 0 then
$iZeit2 = TimerDiff($iZeit)
MsgBox(0, "", "etwas_geladen = true")
; wenn die Zeit verstrichen ist
elseif $iZeit2+15*1000 < TimerDiff($iZeit) then
$bGeladen = false
$iZeit2 = 0
MsgBox(0, "", "etwas_geladen = Zeit vorbei")
lade_etwas() ; neustarten
endif
endif
wend
endfunc
Mir geht es vor allem um die Fkt. lade_etwas(), die lange etwas ladet (Zeit ist dynamisch).
Ich habe auch schon überlegt ob das ein anders Skript ausführt und an dieses, wenn fertig, das Ergebnis übergibt!?