programm schließt erst nach 15sek

  • hi leute! hab mal wieda n problem. wenn ich in meinen programm auf schließen gehe dann passiert erst nahc ca. 15 sek etwas. ich weiß nicht wodran das liegen kann vllt wisst ihr das ja ;)

    hier mal ein teil von script:

    Spoiler anzeigen
    [autoit]

    While 1
    $color1 = GUICtrlRead($Sliderred)
    $color2 = GUICtrlRead($Slidergreen)
    $color3 = GUICtrlRead($Sliderblue)
    $hexred = Hex(GUICtrlRead($Sliderred), 2)
    $hexgreen = Hex(GUICtrlRead($Slidergreen), 2)
    $hexblue = Hex(GUICtrlRead($Sliderblue), 2)
    $hexcode = "0x" & $hexred & $hexgreen & $hexblue
    GUICtrlSetData($ired,$color1)
    GUICtrlSetData($igreen,$color2)
    GUICtrlSetData($iblue,$color3)
    GUICtrlSetData($ihex,$hexcode)
    GUICtrlSetBkColor($lpic,$hexcode)
    sleep(150)
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd

    [/autoit]
  • [autoit]

    sleep(150)
    $nMsg = GUIGetMsg()

    [/autoit]


    Das ist das Problem.
    Im Message-Loop-Modus werden die Messages permanent in einer Schleife abgefragt.
    Immer im Hintergrund und immer im Millisekundenbereich weil ein Event nur eben so eine kurze "Lebensdauer" hat.
    Bei dir passiert folgendes:
    Wenn du grad auf Schließen deiner GUI klickst hängt dein Skript vielleicht gerade im Sleep fest und fragt nicht danach ob irgendein Event aufgetreten ist.
    50ms später ist dein Schließ-Event nicht mehr aktuell, wurde von Windows verworfen und erst dann ist das Skript mit dem Sleep fertig.
    Nun kann aber nicht mehr festgestellt werden das vor 150ms ein Schließbefehl gesendet wurde.

    Kurzum: Das Sleep muss raus wenn es denn unbedingt im Message-Loop-Modus sein soll.
    Würde für den Fall stattdessen den >>GUIOnEvent-Modus<< empfehlen - dann kannst du auch das Sleep drin lassen - es hat dabei keinen Einfluss mehr auf die GUI-Event-Abfrage.

  • es ist mir eigentlich total egal in wechem modus mein script ist es soll ja nur funktionieren^^ ;)

    und das sleep is ja nur da um den prozessor zu schonen.

    also dein guionevent-modus der muss doch soweit ich weiß mit in die gui geschrieben werden oda?

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>

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

    #Region ### START Koda GUI section ### Form=c:\dokumente und einstellungen\andre cordes\desktop\programm\koda-dialog\hex-creator.kxf
    $hex = GUICreate("Hex-Creator", 490, 160, 0, 0, BitOR($WS_MINIMIZEBOX,$WS_DLGFRAME,$WS_GROUP,$WS_CLIPSIBLINGS))
    GUISetBkColor(0xA6CAF0)
    $ired = GUICtrlCreateInput("0", 184, 16, 41, 21, BitOR($ES_RIGHT,$ES_AUTOHSCROLL))
    $igreen = GUICtrlCreateInput("0", 184, 56, 41, 21, BitOR($ES_RIGHT,$ES_AUTOHSCROLL))
    $iblue = GUICtrlCreateInput("0", 184, 96, 41, 21, BitOR($ES_RIGHT,$ES_AUTOHSCROLL))
    $ihex = GUICtrlCreateInput("0x000000", 24, 104, 84, 21, BitOR($ES_CENTER,$ES_AUTOHSCROLL))
    $Sliderblue = GUICtrlCreateSlider(240, 94, 246, 29, BitOR($TBS_AUTOTICKS,$TBS_BOTH,$TBS_NOTICKS))
    GUICtrlSetLimit($Sliderblue,255,0)
    GUICtrlSetBkColor($Sliderblue,0xA6CAF0)
    $Slidergreen = GUICtrlCreateSlider(240, 54, 246, 29, BitOR($TBS_AUTOTICKS,$TBS_BOTH,$TBS_NOTICKS))
    GUICtrlSetLimit($Slidergreen,255,0)
    GUICtrlSetBkColor($Slidergreen,0xA6CAF0)
    $Sliderred = GUICtrlCreateSlider(240, 14, 246, 25, BitOR($TBS_AUTOTICKS,$TBS_BOTH,$TBS_NOTICKS))
    GUICtrlSetLimit($Sliderred,255,0)
    GUICtrlSetBkColor($Sliderred,0xA6CAF0)
    $lpic = GUICtrlCreateLabel("", 24, 16, 84, 76)
    GUICtrlSetBkColor(-1, 0x000000)
    GUICtrlCreateLabel("Red", 128, 16, 42, 21, $SS_CENTERIMAGE)
    GUICtrlSetColor(-1, 0xFF0000)
    GUICtrlCreateLabel("Green", 128, 56, 42, 17, $SS_CENTERIMAGE)
    GUICtrlSetColor(-1, 0x008000)
    GUICtrlCreateLabel("Blue", 128, 96, 42, 17, $SS_CENTERIMAGE)
    GUICtrlSetColor(-1, 0x0000FF)
    GUICtrlCreateLabel("Made by .::Mignon::.", 384, 120, 101, 13)
    GUICtrlSetColor(-1, 0x0000FF)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $color1 = GUICtrlRead($Sliderred)
    $color2 = GUICtrlRead($Slidergreen)
    $color3 = GUICtrlRead($Sliderblue)
    $hexred = Hex(GUICtrlRead($Sliderred), 2)
    $hexgreen = Hex(GUICtrlRead($Slidergreen), 2)
    $hexblue = Hex(GUICtrlRead($Sliderblue), 2)
    $hexcode = "0x" & $hexred & $hexgreen & $hexblue
    GUICtrlSetData($ired,$color1)
    GUICtrlSetData($igreen,$color2)
    GUICtrlSetData($iblue,$color3)
    GUICtrlSetData($ihex,$hexcode)
    GUICtrlSetBkColor($lpic,$hexcode)
    sleep(150)
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd

    [/autoit]
    • Offizieller Beitrag
    Zitat

    und das sleep is ja nur da um den prozessor zu schonen.


    Bei GUIGetMsg völlig überflüssig. Diese Funktion führt selbst zu einer Lastreduzierung.
    Wie Junkie schon sagte, OnEvent-Mode - dann ist Sleep OK, aber im GUIGetMsg-Mode bremst es.

    Die Festlegung des Modus erfolgt direkt nach den Includes. GUIGetMsg-Mode ist default und braucht deshalb nicht deklariert werden.
    Ansonsten:

    [autoit]

    Opt("GUIOnEventMode", 1)

    [/autoit]
  • ok erst mal danke an bugfix und aspirinjunkie ;).
    ich werde es dann mal so versuchen und es dann posten.^^

    EDIT: ok ich hab es jetz hinbekommen aba eine frage hab ich da noch zur whle schleife. dann da jezt der ganze kram mit case...eigentlich weg???

    kann man es statt so:

    Spoiler anzeigen
    [autoit]

    While 1
    $color1 = GUICtrlRead($Sliderred)
    $color2 = GUICtrlRead($Slidergreen)
    $color3 = GUICtrlRead($Sliderblue)
    $hexred = Hex(GUICtrlRead($Sliderred), 2)
    $hexgreen = Hex(GUICtrlRead($Slidergreen), 2)
    $hexblue = Hex(GUICtrlRead($Sliderblue), 2)
    $hexcode = "0x" & $hexred & $hexgreen & $hexblue
    GUICtrlSetData($ired,$color1)
    GUICtrlSetData($igreen,$color2)
    GUICtrlSetData($iblue,$color3)
    GUICtrlSetData($ihex,$hexcode)
    GUICtrlSetBkColor($lpic,$hexcode)
    sleep(150)
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd

    [/autoit]

    auch jezt so schreiben:

    Spoiler anzeigen
    [autoit]

    While 1
    $color1 = GUICtrlRead($Sliderred)
    $color2 = GUICtrlRead($Slidergreen)
    $color3 = GUICtrlRead($Sliderblue)
    $hexred = Hex(GUICtrlRead($Sliderred), 2)
    $hexgreen = Hex(GUICtrlRead($Slidergreen), 2)
    $hexblue = Hex(GUICtrlRead($Sliderblue), 2)
    $hexcode = "0x" & $hexred & $hexgreen & $hexblue
    GUICtrlSetData($ired,$color1)
    GUICtrlSetData($igreen,$color2)
    GUICtrlSetData($iblue,$color3)
    GUICtrlSetData($ihex,$hexcode)
    GUICtrlSetBkColor($lpic,$hexcode)
    sleep(150)
    WEnd

    [/autoit]

    Einmal editiert, zuletzt von .::Mignon::. (28. Oktober 2007 um 15:29)

  • ouha^^ also nehme ich mal an du kannst mir auch nicht sagen wie das mit dme traymenu im eventmodus ist oda? ;)