Danke für eure bemühungen.
Das Script von dir ist ganz gut aber leider habe ich nicht SO einen Timer sondern einen aus einer eigenen Bastelaktion. Leider kann ich aus deinem Script auch nicht entnehmen wodran es liegt das er bei dir weiterzählt (mir würde reichen wenn er das im Hintergrund tut). Werde mich wohl damit abfinden müssen das es nicht geht.
A3LGDIPlus.au3 oder GTASPIDER HILF!!! xD
-
- [ offen ]
-
akira2012 -
20. Juli 2007 um 12:25 -
Geschlossen -
Erledigt
-
-
- Offizieller Beitrag
Bernd hat doch gezeigt, dass es mit den _Timer_SetTimer-Funktionen sehr wohl möglich ist, eine Funktion weiterlaufen zu lassen, obwohl das Traymenü geöffnet ist.
Vielleicht postest Du mal Dein Script, dann können wir mal gucken, woran es liegt. -
Ok - Versuch macht kluch.
Spoiler anzeigen
[autoit][/autoit] [autoit][/autoit] [autoit]Func _Minutenzaehler()
[/autoit] [autoit][/autoit] [autoit][/autoit]
;GUICtrlSetData($Informationsfeld, "")
GUICtrlSetState($Eingabefeld, $GUI_DISABLE)
GUICtrlSetState($Umschaltkaestchen, $GUI_DISABLE)
GUICtrlSetState($Auswahl, $GUI_DISABLE)
GUICtrlSetState($Start, $GUI_DISABLE)
$Eingabefeld = GUICtrlRead($Eingabefeld)
$ZeitinSekunden = $Eingabefeld * 60
$Aktion = GUICtrlRead($Auswahl)
If $Aktion = "Auswählen..." Then
MsgBox(16, "Fehler!!", "Erst eine Aktion auswählen!!!")
ElseIf $Eingabefeld = "" Then
MsgBox(16, "Fehler!!", "Bitte die Zeit angeben!!!")
Else
For $i = 1 To $ZeitinSekunden
$StTime = TimerInit()
$test3 = 1
$EineSekunde = 1000
$AktuelleZeitinSekunden = $ZeitinSekunden - $i
$inMinutenumrechnung = ($ZeitinSekunden - $i) / 60
$Minuten = Int($inMinutenumrechnung)
$WoistderMauszeiger = GUIGetCursorInfo($controlGui)
$Maustaste1gedrueckt = _IsPressed("01")
Switch $Minuten
Case 1 To 9999999999
$Sekunden = $AktuelleZeitinSekunden - ($Minuten * 60)
Case 0
$Sekunden = $AktuelleZeitinSekunden
EndSwitch
GUICtrlSetData($Informationsfeld, "Folgende Aktion wird in " & @LF & $Minuten & " Minuten und " & $Sekunden & " Sekunden" & @LF & "durchgeführt: " & @LF & $Aktion)
Do
Sleep(100)
Abbrechen()
minimieren()
Until TimerDiff($StTime) > $EineSekunde
Next
If $test3 = 1 Then
Switch $Aktion
Case "Runterfahren"
Shutdown(5)
Case "Neustarten"
Shutdown(6)
Case "Abmelden"
Shutdown(0)
Case "StandBy"
Shutdown(32)
Exit
EndSwitch
EndIf
EndIf
GUICtrlSetState($Eingabefeld, $GUI_ENABLE)
GUICtrlSetState($Auswahl, $GUI_ENABLE)
GUICtrlSetState($Start, $GUI_ENABLE)
EndFunc ;==>_Minutenzaehler -
Habt ihrs euch nochmal angeschaut? Kann man da was machen bezüglich des Fortlaufens?
-
- Offizieller Beitrag
Die Funktion allein reicht nicht. Du müsstest schonmal das gesamte Script posten.
Oder mir mal als PN schicken, dann kann ich mal schauen, was man da machen kann. -
Hi,
ich werd deinen vorschlag beherzigen und alles neu aufrollen also mach dich schonmal auf ein paar blöde fragen gefasst, oscar -
- Offizieller Beitrag
Kein Problem!
Ich denke, es ist wirklich das beste, wenn Du das Script von Grund auf neu machst. -
Ich habe schonmal eine Grundsätzliche Frage.. Die Berechnung der verbleibenden Zeit etc. ist bei mir ja "einigermaßen" chaotisch. Gibts dafür mittlerweile eine Funktion die mir das alles automatisch ausrechnet? Ich hab nicht wirklich was gefunden...
-
Halli Hallo,
ich habe versucht mit der Funktion _timer_settimer irgendwas brauchbares zu erstellen das mir die verbleibende Zeit wiedergibt aber irgendwie funktioniert das nicht. Hat mal wer ein EINFACHES Beispiel für diese Funktion?
Danke schonmal...
-
- Offizieller Beitrag
Wenn Du Dich noch etwas gedulden kannst, schreibe ich Dir mal ein Beispiel. Komme aber wohl erst heute nachmittag dazu.
-
- Offizieller Beitrag
So bin wieder da. Hier kommt das versprochene Beispiel:
Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
#include <Date.au3>
#include <DateTimeConstants.au3>
#include <GuiConstantsEx.au3>
#include <Timers.au3>
Global $sStartTime = '02:00:00' ; 2 Stunden
Global $iTimer$hGUI = GUICreate("Timer-Test", 400, 320)
[/autoit] [autoit][/autoit] [autoit]
$hTime = GUICtrlCreateLabel($sStartTime, 20, 20, 90, 25)
GUICtrlSetFont(-1, 12)
$hStart = GUICtrlCreateButton("Start", 20, 60, 90, 22)
GUISetState()While 1
[/autoit] [autoit][/autoit] [autoit]
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
_Timer_KillAllTimers($hGUI)
Exit
Case $hStart
GUICtrlSetState($hStart, $GUI_DISABLE)
$iTimer = TimerInit()
_Timer_SetTimer($hGUI, 1000, "_Timer")
EndSwitch
WEndFunc _Timer($hWnd, $Msg, $iIDTimer, $dwTime)
[/autoit]
Local $Secs, $Mins, $Hour
Local $iStartTicks = _TimeToTicks(StringLeft($sStartTime, 2), StringMid($sStartTime, 4, 2), StringRight($sStartTime, 2))
_TicksToTime($iStartTicks - Int(TimerDiff($iTimer)), $Hour, $Mins, $Secs)
GUICtrlSetData($hTime, StringFormat("%02i:%02i:%02i", $Hour, $Mins, $Secs))
EndFunc ;==>_Timer -
Ok.. ähm. Ja. Also. Hm. Ich versteh das mit den Ticks nicht. Was ist ein Tick? Wie lange dauert ein Tick? Ist ein Tick eine Sekunde? Kann ich Sekunden in Ticks umrechnen und dann in Zeit? Oder MUSS ich für diese Variante eine feste Uhrzeit haben zum umwandeln?`Sry aber versuche grad das nachzuvollziehen da mit copy&pate ja nichts bringt.
-
- Offizieller Beitrag
Also Ticks sind Millisekunden.
Hier das Beispiel nochmal kommentiert:
Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
#include <Date.au3>
#include <DateTimeConstants.au3>
#include <GuiConstantsEx.au3>
#include <Timers.au3>
Global $sStartTime = '02:00:00' ; 2 Stunden
Global $iTimer$hGUI = GUICreate("Timer-Test", 400, 320)
[/autoit] [autoit][/autoit] [autoit]
$hTime = GUICtrlCreateLabel($sStartTime, 20, 20, 90, 25)
GUICtrlSetFont(-1, 12)
$hStart = GUICtrlCreateButton("Start", 20, 60, 90, 22)
GUISetState()While 1
[/autoit] [autoit][/autoit] [autoit]
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
_Timer_KillAllTimers($hGUI)
Exit
Case $hStart
GUICtrlSetState($hStart, $GUI_DISABLE)
$iTimer = TimerInit() ; Timer initialisieren
_Timer_SetTimer($hGUI, 1000, "_Timer") ; Die Funktion "_Timer" jede Sekunde (1000 Millisekunden) aufrufen
EndSwitch
WEndFunc _Timer($hWnd, $Msg, $iIDTimer, $dwTime)
[/autoit]
Local $Secs, $Mins, $Hour
Local $iStartTicks = _TimeToTicks(StringLeft($sStartTime, 2), StringMid($sStartTime, 4, 2), StringRight($sStartTime, 2)) ; Startzeit in Ticks umwandeln
_TicksToTime($iStartTicks - Int(TimerDiff($iTimer)), $Hour, $Mins, $Secs) ; Startticks minus die Ticks vom Timer ergeben die Restzeit in Std:Min:Sek
GUICtrlSetData($hTime, StringFormat("%02i:%02i:%02i", $Hour, $Mins, $Secs)) ; im Label anzeigen
EndFunc ;==>_Timer -
ES FUNKTIONIERT - dER TIMER FUNKTIONIERT xD
Vielen Dank! --> weitere Fragen folgen ;P
-
Hallo,
habe wieder ein neues Problem. Das heißt eigentlich ist es kein wirkliches Problem eher ein Performance-Problem. Wenn ich in meiner GUI auf den Start-Button drücke, dann passiert 2 sek nichts bevor die Function startet. Es ist in sofern merkwürdig weil ich KEIN einziges sleep benutze. Wodran kann das liegen?
Achja ich benutze den messageloop mode oder wie das heißt -
- Offizieller Beitrag
Meine Kristallkugel sagt, dass es ganz hilfreich wäre, wenn Du Dein Script mal postest.
-
Lol. *DOING*
Sorry das war das berühmte Brett vorm KoppSpoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
#cs ----------------------------------------------------------------------------AutoIt Version: 3.3.0.0
[/autoit] [autoit][/autoit] [autoit]
Author: myNameScript Function:
[/autoit] [autoit][/autoit] [autoit]
Template AutoIt script.#ce ----------------------------------------------------------------------------
[/autoit] [autoit][/autoit] [autoit]; Script Start - Add your code below here
[/autoit] [autoit][/autoit] [autoit]
#include <Date.au3>
#include <GUIConstantsEx.au3>
#include <GuiConstants.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>
#include <ButtonConstants.au3>
#include <Timers.au3>
#include <GDIPlus.au3>
#include <WinAPI.au3>
#Include <Constants.au3>Global $timer, $Secs, $Mins, $Hour, $Time, $verbleibendemillisekunden, $verbleibendeSekunden, $iTimer
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
Global Const $AC_SRC_ALPHA = 1Dim $size[5], $width = 85, $high = 25, $test3, $Minuten, $Sekunden, $Stunden
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]_GDIPlus_Startup()
[/autoit] [autoit][/autoit] [autoit]
$pngSrc = @ScriptDir & "\ST.png"
$hImage = _GDIPlus_ImageLoadFromFile($pngSrc)
$width2 = _GDIPlus_ImageGetWidth($hImage)
$height2 = _GDIPlus_ImageGetHeight($hImage)$ST = GUICreate("Shutdowntimer", $width2, $height2, -1, -1, $WS_POPUP, $WS_EX_LAYERED)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
SetBitmap($ST, $hImage, 0)
;GUISetBkColor(0x000000)
GUIRegisterMsg($WM_NCHITTEST, "WM_NCHITTEST")
GUISetState()
WinSetOnTop($ST, "", 1)
;fade in png background
For $i = 0 To 255 Step 5
SetBitmap($ST, $hImage, $i)
Next$kontrollGui = GUICreate("ShutDownTimer", 350, 250, -1, -1,$WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_MDICHILD), $ST)
[/autoit] [autoit][/autoit] [autoit]
GUISetBkColor(0x000000, $kontrollGui)GUICtrlCreateLabel("Shutdown-Timer", 90, 50, 200)
[/autoit] [autoit][/autoit] [autoit]
GUICtrlSetColor(-1, 0xFFFFFF)
GUICtrlSetBkColor(-1, 0x000000)
GUICtrlSetFont(-1, 16, 500, 2)$Startbutton = GUICtrlCreateButton("Start", 70, 125, $width, $high)
[/autoit] [autoit][/autoit] [autoit]
GUICtrlSetTip($Startbutton, "Startet den Countdown zur ausgewählten Aktion.")$minimieren = GUICtrlCreatePic(@ScriptDir & "\Minimize.bmp", 30, 20, 40, 40)
[/autoit] [autoit][/autoit] [autoit]$Minuteneingabe = GUICtrlCreateInput("", 70, 90, $width, $high)
[/autoit] [autoit][/autoit] [autoit]
GUICtrlSetTip($Minuteneingabe, "Zeit in Minuten in der der Rechner die ausgewählte Aktion durchführen soll")$ZeitStunden = GUICtrlCreateCombo(@HOUR, 70, 90, $width / (2.3), $high)
[/autoit] [autoit][/autoit] [autoit]
GUICtrlSetData($ZeitStunden, "00|01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23")
GUICtrlSetBkColor($ZeitStunden, 0xFFFFFF)
GUICtrlSetTip($ZeitStunden, "Uhrzeit eingeben: Stunden (0-24)")
GUICtrlSetState($ZeitStunden, $GUI_HIDE)$Doppelpunkt = GUICtrlCreateLabel(":", 111, 95, 5)
[/autoit] [autoit][/autoit] [autoit]
GUICtrlSetColor($Doppelpunkt, 0xFFFFFF)
GUICtrlSetBkColor($Doppelpunkt, 0x000000)
GUICtrlSetState($Doppelpunkt, $GUI_HIDE)
GUICtrlCreateLabel("00:00:00", 10, 10)
GUICtrlSetColor($Doppelpunkt, 0xFFFFFF)$ZeitMinuten = GUICtrlCreateCombo(@MIN, 118, 90, $width / (2.3), $high)
[/autoit] [autoit][/autoit] [autoit]
GUICtrlSetData($ZeitMinuten, "00|01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|32|33|34|35|36|37|38|39|40|41|42|43|44|45|46|47|48|49|50|51|52|53|54|55|56|57|58|59|60")
GUICtrlSetBkColor($ZeitMinuten, 0xFFFFFF)
GUICtrlSetTip($ZeitMinuten, "Uhrzeit eingeben: Minuten (0-60)")
GUICtrlSetState($ZeitMinuten, $GUI_HIDE)$Umschaltkaestchen = GUICtrlCreateCheckbox("", 45, 95, 20, 20)
[/autoit] [autoit][/autoit] [autoit]
GUICtrlSetBkColor($Umschaltkaestchen, 0x000000)
GUICtrlSetTip($Umschaltkaestchen, "Schaltet von Minuten in Uhrzeit Modus")$Abbrechen = GUICtrlCreateButton("Abbrechen", 185, 125, $width, $high)
[/autoit] [autoit][/autoit] [autoit]
GUICtrlSetTip($Abbrechen, "Hier klicken um den Countdown zu stoppen und das Programm zu beenden.")$Auswahl = GUICtrlCreateCombo("Auswählen...", 185, 90, $width, $high)
[/autoit] [autoit][/autoit] [autoit]
GUICtrlSetTip($Auswahl, "Bitte wähle aus welche Aktion durchgeführt werden soll")
GUICtrlSetData($Auswahl, "Runterfahren|Neustarten|Abmelden|StandBy")$Informationsfeld = GUICtrlCreateLabel("", 70, 190, 200, 60, 0x1001)
[/autoit] [autoit][/autoit] [autoit]
GUICtrlSetColor($Informationsfeld, 0xFFFFFF)GUISetState()
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]While 1
[/autoit] [autoit][/autoit] [autoit]
$msg = GUIGetMsg()
Switch $msg
Case $Umschaltkaestchen
$Test = GUICtrlRead($Umschaltkaestchen)
If $Test = $GUI_CHECKED Then
GUICtrlSetState($Minuteneingabe, $GUI_HIDE)
GUICtrlSetState($ZeitMinuten, $GUI_SHOW)
GUICtrlSetState($ZeitStunden, $GUI_SHOW)
Else
GUICtrlSetState($Minuteneingabe, $GUI_SHOW)
GUICtrlSetState($ZeitMinuten, $GUI_HIDE)
GUICtrlSetState($ZeitStunden, $GUI_HIDE)
EndIfCase $Abbrechen
[/autoit] [autoit][/autoit] [autoit]
ExitLoopCase $Startbutton
[/autoit] [autoit][/autoit] [autoit]
$Test = GUICtrlRead($Umschaltkaestchen)
If $Test = $GUI_CHECKED Then
_Start()
Else
_Start2()
EndIfCase $GUI_EVENT_CLOSE
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
ExitLoop
EndSwitchWEnd
[/autoit] [autoit][/autoit] [autoit]Func _start()
[/autoit] [autoit][/autoit] [autoit]
Global $durchzufuehrendeAktion = GUICtrlRead($Auswahl)
Global $ReadStunden = GUICtrlRead($ZeitStunden)
Global $ReadMinuten = GUICtrlRead($ZeitMinuten)
$GesamtZeitinSekunden = ($ReadStunden * 3600) + ($ReadMinuten * 60)
$RealeZeitinSekunden = (@HOUR * 3600) + (@MIN * 60) + @SEC
Global $verbleibendeSekunden = $GesamtZeitinSekunden - $RealeZeitinSekunden
Global $verbleibendemillisekunden = $verbleibendeSekunden * 1000
Global $iTimer = TimerInit()
_Timer_SetTimer($kontrollGui, 999, "_Timer")
AdlibEnable("_aktion", $verbleibendemillisekunden)
EndFunc ;==>_startFunc _start2()
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
Global $durchzufuehrendeAktion = GUICtrlRead($Auswahl)
$Minuten = GUICtrlRead($Minuteneingabe)
Global $verbleibendemillisekunden = ($Minuten * 60) * 1000
Global $iTimer = TimerInit()
_Timer_SetTimer($kontrollGui, 999, "_Timer")
AdlibEnable("_aktion", $verbleibendemillisekunden)
EndFunc ;==>_start2Func _Timer($hWnd, $msg, $iIDTimer, $dwTime)
[/autoit] [autoit][/autoit] [autoit]
Local $Secs, $Mins, $Hour
_TicksToTime($verbleibendemillisekunden - Int(TimerDiff($iTimer)), $Hour, $Mins, $Secs)
StringFormat("%02i:%02i:%02i", $Hour, $Mins, $Secs)
If $hour <> 0 Then
GUICtrlSetData($Informationsfeld, "Folgende Aktion wird in " & @LF & $Hour & " Stunden, " & $Mins & " Minuten und " & $Secs & " Sekunden durchgeführt: " & @LF &$durchzufuehrendeAktion)
ElseIf $hour = 0 AND $Mins <> 0 Then
GUICtrlSetData($Informationsfeld, "Folgende Aktion wird in " & @LF & $Mins & " Minuten und " & $Secs & " Sekunden durchgeführt: " & @LF &$durchzufuehrendeAktion)
ElseIf $hour = 0 AND $Mins = 0 AND $Secs <> 0 Then
GUICtrlSetData($Informationsfeld, "Folgende Aktion wird in " & @LF & $Secs & " Sekunden durchgeführt: " & @LF &$durchzufuehrendeAktion)
ElseIf $hour = 0 AND $Mins = 0 AND $Secs = 0 Then
GUICtrlSetData($Informationsfeld, "Folgende Aktion wird jetzt durchgeführt: " & @LF &$durchzufuehrendeAktion)
EndIfEndFunc ;==>_Timer
[/autoit] [autoit][/autoit] [autoit]Func _aktion()
[/autoit] [autoit][/autoit] [autoit]
Switch $durchzufuehrendeAktion
Case "StandBy"
Shutdown(32)
ExitCase "Runterfahren"
[/autoit] [autoit][/autoit] [autoit]
Shutdown(17)Case "Neustarten"
[/autoit] [autoit][/autoit] [autoit]
Shutdown(18)Case "Abmelden"
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
Shutdown(0)
Exit
EndSwitch
EndFunc ;==>_aktionFunc SetBitmap($hGUI, $hImage, $iOpacity)
[/autoit] [autoit][/autoit] [autoit]
Local $hScrDC, $hMemDC, $hBitmap, $hOld, $pSize, $tSize, $pSource, $tSource, $pBlend, $tBlend$hScrDC = _WinAPI_GetDC(0)
[/autoit] [autoit][/autoit] [autoit]
$hMemDC = _WinAPI_CreateCompatibleDC($hScrDC)
$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
$hOld = _WinAPI_SelectObject($hMemDC, $hBitmap)
$tSize = DllStructCreate($tagSIZE)
$pSize = DllStructGetPtr($tSize)
DllStructSetData($tSize, "X", _GDIPlus_ImageGetWidth($hImage))
DllStructSetData($tSize, "Y", _GDIPlus_ImageGetHeight($hImage))
$tSource = DllStructCreate($tagPOINT)
$pSource = DllStructGetPtr($tSource)
$tBlend = DllStructCreate($tagBLENDFUNCTION)
$pBlend = DllStructGetPtr($tBlend)
DllStructSetData($tBlend, "Alpha", $iOpacity)
DllStructSetData($tBlend, "Format", $AC_SRC_ALPHA)
_WinAPI_UpdateLayeredWindow($hGUI, $hScrDC, 0, $pSize, $hMemDC, $pSource, 0, $pBlend, $ULW_ALPHA)
_WinAPI_ReleaseDC(0, $hScrDC)
_WinAPI_SelectObject($hMemDC, $hOld)
_WinAPI_DeleteObject($hBitmap)
_WinAPI_DeleteDC($hMemDC)
EndFunc ;==>SetBitmapFunc WM_NCHITTEST($hWnd, $iMsg, $iwParam, $ilParam)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit]
If ($hWnd = $ST) And ($iMsg = $WM_NCHITTEST) Then Return $HTCAPTION
EndFunc ;==>WM_NCHITTEST -
Also es ist bestimmt lächerlich - ganz bestimmt! Aber ich frag trotzdem....
Kann es sein das es eine Zeitliche Differenz zwischen drücken des Startbuttons und dem beginnen der Gui gibt weil die verbleibenden milisekunden berechnet werden? Ne oder? Sowas sollte ein Rechner doch in 1 Millisekunde erledigt haben oder? O_O
-
- Offizieller Beitrag
Nein, das ist nicht der Grund!
Die Verzögerung tritt deshalb auf, weil _Timer_SetTimer die dort angegebene Funktion erst nach Ablauf der angegebenen Zeit das erste Mal aufruft.
Willst Du sofort eine Anzeige, so musst Du die Funktion einmalig sofort aufrufen. -
Doooooooooh -.-
Lol - jetzt wo du es sagst ist es logisch aber da wäre ichin 10 Jahren nicht drauf gekommen. DANKE! ^_^*
-