• Aufgrund dieses Theades:
    [ gelöst ] Uhrzeit ständig aktualisieren, aber wie?

    habe ich mal schnell etwas geschireben um eine MsgBox zu aktualisieren:
    (benutzt meine unsichere Thread-UDF :P)

    Spoiler anzeigen
    [autoit]


    #include <Misc.au3>

    [/autoit] [autoit][/autoit] [autoit]

    _MsgBox(0,"Test","Es klappt! :)")
    Sleep(10)
    $t=TimerInit()
    While Not _IsPressed("1B")
    ControlSetText("Test","","[CLASS:Static; INSTANCE:1]",@HOUR&":"&@MIN&":"&@SEC)
    Sleep(10)
    WEnd
    While TimerDiff($t)<1000
    Sleep(10)
    WEnd
    Exit

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _MsgBox($flag,$title,$message)
    _ThreadCreate("__ThMB","int;char[101];char[501]",$flag&";"&$title&";"&$message)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func __ThMB($struct)
    Local $data=_ThreadDataRead($struct,"int;char[101];char[501]")
    Local $t=TimerInit()
    MsgBox($data[0],$data[1],$data[2])
    While TimerDiff($t)<1000
    Sleep(10)
    WEnd
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _ThreadCreate($func,$globalstruct="",$zuweisungen="") ;$func must have one Parameter, Data can be read with _ThreadDataRead
    Local $threadinfo[3],$ptr
    If $globalstruct="" Then
    $ptr=0
    Else
    $struct=DllStructCreate($globalstruct)
    If $zuweisungen<>"" Then
    Local $split=StringSplit($zuweisungen,";")
    If @error Then
    Local $split[2]
    $split[0]=1
    $split[1]=$zuweisungen
    EndIf
    For $x=1 To $split[0]
    DllStructSetData($struct,$x,$split[$x])
    Next
    EndIf
    $ptr=DllStructGetPtr($struct)
    EndIf
    Local $cbr=DllCallbackRegister($func,"int","ptr")
    Local $ret=DllCall("kernel32.dll","hwnd","CreateThread","ptr",0,"dword",0,"long",DllCallbackGetPtr($cbr),"ptr",$ptr,"long",0,"int*",0)
    If Not IsArray($ret) Or @error Then Return SetError(@error,@extended,0)
    $threadinfo[0]=$ret[0];Handle
    $threadinfo[1]=$ret[6];Thread-ID
    $threadinfo[2]=$globalstruct;information struct
    Return $threadinfo
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _ThreadDataRead($param,$tgis);Returns Data in Array
    If $tgis="" Then Return 0
    $struct=DllStructCreate($tgis,$param)
    Local $split=StringSplit($tgis,";")
    If @error Then
    Local $split[2]
    $split[0]=1
    EndIf
    Local $ret[$split[0]]
    For $x=1 To $split[0]
    $ret[$x-1]=DllStructGetData($struct,$x)
    Next
    Return $ret
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _ThreadClose(ByRef $threadinfo,$exitcode=0)
    If Not IsArray($threadinfo) Then Return SetError(1,0,-1)
    DllCall("kernel32.dll","bool","TerminateThread","handle",$threadinfo[0],"dword",$exitcode)
    DllCall("kernel32.dll","int","CloseHandle","handle",$threadinfo[0])
    EndFunc

    [/autoit]

    Viel Spaß damit

    EDIT:
    Es muss am Anfang mindestens ein Zeichen in der MsgBox stehen, damit ein Label erstellt wird

    EDIT:
    Stürzt doch manchmal ab, aber seltener. Autoit ist 0% Threadsicher

    EDIT:
    Habs noch ein bisschen besser hingekriegt, dass es nicht so oft abstürzt

    6 Mal editiert, zuletzt von TheShadowAE (27. Juni 2010 um 14:36)

  • Hi,
    ich bin relativ neu bei autoit und versteh deshalb noch nicht so ganz, was ab Zeile 19 passiert :D und was Threads sind.

    MfG mazZ