 |
AutoHotkey Community Wir helfen uns gegenseitig aus der Patsche
|
| Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
| Autor |
Nachricht |
Boskoop
Anmeldedatum: 18.12.2005 Beiträge: 60
|
Verfasst am: Sa Jan 06, 2007 9:26 pm Titel: Einfache Scheduler-Funktion |
|
|
Diese Funktion startet einen Task an einem bestimmten Wochentag um eine bestimmte Uhrzeit. In den Autostart-Order kopiert übersteht es einen Neustart. Es übersteht den Ruhezustand, kann allerdinigs den Rechner nicht aus dem Ruhezustand wecken.
Eigentlich erledigt Windows "Geplante Tasks" sowas komfortabler und besser- aber manchmal kann man die nicht benutzen (z. B. in unserem Netzwerk, wo aus Gründen, die offenbar nichtmal der Sysadmin versteht, alle geplanten Tasks beim Rechnerneustart gelöscht werden). Weitere Taskplaner findet man unter "Time and Scheduling" im "Catalogue of All Scripts" und beim Suchen nach "Scheduler" in der englischen Newsgroup.
Das Posting ist als eine Art Vorlage oder "Skelett" gedacht. Es sollte kurz und übersichtlich bleiben, deshalb habe ich nicht versucht, mögliche Probleme durch ungünstige Wahl und Kombination von Parametern abzufangen.
Ich benutze das Skript übrigens so wie es ist (allerings mit anderen Zeitparametern). Es erinnert mich an eine 5-Minuten- Aufgabe, die ich einmal pro Woche innerhalb von 1,5 Stunden ausführen muß- und immer wieder vergesse. Das Skript startet bei mir alle 10 Minuten für ein paar Sekunden einen Splash-Screen, der mich zur Erledigung auffordert.
Schöne Grüße
Boskoop
| Code: | /*
Überprüft in wählbaren Abständen (CheckInterval) Wochentag und Uhrzeit und startet
eine Anwendung wenn die Zielzeit erreicht ist.
*/
;-----------Konfiguration------------------------
DayOfWeek=1 ;Sonntag=1!
Hour=10
Minute=27
CheckInterval=3 ;in Sekunden. In welchen Abständen soll die Zeit überprüft werden?
Application="sol.exe" ;das zu startende Programm mit vollem Pfad
#Persistent
;-----------Autorun-------------------------------
CheckTime(DayOfWeek,Hour,Minute,CheckInterval,Application)
;-----------Funktionen----------------------------
CheckTime(DayOfWeek,Hour,Minute,CheckInterval,Application)
{
;Variablen müssen static (oder global) sein, sonst kriegen das Label TimeCheck
;sie nicht übergeben:
Static Wochentag, Stunde, Min, Pruefen, Programm
Wochentag:=DayOfWeek, Stunde:=Hour, Min:=Minute, Pruefen:=CheckInterval*1000, Programm:=Application
SetTimer, TimeCheck, %Pruefen%
return
TimeCheck:
;überprüft Datum und Zeit und startet bei Bedarf eine Anwendung
if (A_WDay=Wochentag and A_Hour=Stunde and A_Min>=Min)
{
run, %Programm%
SetTimer,TimeCheck, Off
Sleep, 6000 ; Empfohlen: 4000000 (Etwas mehr als eine Stunde)
SetTimer, TimeCheck, %Pruefen%
return
}
else
{
return
}
}
|
Edit
7.01.07: Skript verkürzt und vereinfacht
Zuletzt bearbeitet von Boskoop am So Jan 07, 2007 3:53 pm, insgesamt einmal bearbeitet |
|
| Nach oben |
|
 |
BoBo Gast
|
Verfasst am: So Jan 07, 2007 12:19 pm Titel: |
|
|
| Zitat: | | ;Variablen müssen global sein, sonst kriegen das Label sie nicht übergeben | Sofern diese nicht geziehlt an die Funktion übergeben werden, was du im Funktionsaufruf schon getan hast, oder?. Die Bezeichner der Zielfunktion müssen nicht identisch mit denen des Funktionsaufrufs benannt sein. Lediglich die Anzahl und Position ist hier AFAIK von Bedeutung.
| Code: | DayOfWeek=1 ; Sonntag=1!
Hour=10
Minute=27
CheckInterval=3
Application="sol.exe"
Aufrufender Funktionsaufruf:
CheckTime(DayOfWeek,Hour,Minute,CheckInterval,Application)
ZielFunktion:
CheckTime(Wochentag,Stunde,Min,Pruefen,Programm)
{
MsgBox, %Wochentag%`n%Stunde%`n%Min%`n%Pruefen%`n%Programm%
} | Alternativ geht auch das:
| Code: | Aufrufender Funktionsaufruf:
CheckTime("1","10","27","3","sol.exe")
ZielFunktion:
CheckTime(Wochentag,Stunde,Min,Pruefen,Programm)
{
MsgBox, %Wochentag%`n%Stunde%`n%Min%`n%Pruefen%`n%Programm%
} |
|
|
| Nach oben |
|
 |
Boskoop
Anmeldedatum: 18.12.2005 Beiträge: 60
|
Verfasst am: So Jan 07, 2007 3:51 pm Titel: |
|
|
Hallo Bobo,
vielen Dank für Deinen Kommentar. Du hast recht: Das mit "global" ist umständlich und unlogisch- aber ich kann nix dafür .
Leider funktioniert der von Dir vorgeschlagene Code nicht. Abhängig davon, ob eine Subroutine innerhalb einer Funktion mit "Gosub" oder "Settimer" aufgerufen wird werden die Parameter anders behandelt.
1. Bei "Gosub" sieht die Subroutine alle der Funktion übergebenen Parameter:
| Code: |
;FUNKTIONIERT:
MyTxt:="Huhuuu!"
MyFunction(MyTxt) ;MyFunction("Huhuuu!")geht auch!
;-----------Funktionen----------------------------
MyFunction(MyTxt)
{
Gosub Sub
return
Sub:
msgbox, %MyTxt%
return
} |
2. Ruft man die gleiche Subroutine mit "Settimer" auf, sieht die Soubroutine die Parameter nicht:
| Code: |
;FUNKTIONIERT NICHT. "Sub" hat keine Zugriff auf den Inhalt der Variable "MyText"
#persistent
MyTxt:="Huhuuu!"
MyFunction(MyTxt)
;-----------Funktionen----------------------------
MyFunction(MyTxt)
{
SetTimer, Sub, 3000
return
Sub:
SetTimer, Sub, off
msgbox, %MyTxt%
exitapp
} |
3. Auf eine innerhalb der Funktion als "Global" deklarierte Variable hat die Subroutine wieder Zugriff:
| Code: | ;FUNKTIONIERT:
#persistent
MyTxt:="Huhuuu!"
MyFunction(MyTxt)
;-----------Funktionen----------------------------
MyFunction(MyTxt)
{
global Blabla:=MyTxt ;Variable als "Global" deklariert
SetTimer, Sub, 3000
return
Sub:
SetTimer, Sub, off
msgbox, %Blabla%
exitapp
} |
Es ist schöner, "static" statt "global" zu nehmen- dann ist die Variable "Blabla" nur innerhalb der Funktion sichtbar. Leider ist die "static"-Syntax etwas umständlicher. Ich änderes es trotzdem im Ursprungsposting.
Wenn ich die Doku richtig verstehe, muß das mit global/ static so sein- es ist kein Bug. Die Doku schreibt zum Thema Using Subroutines Within a Function und Variablendeklaration:
| Zitat: | | A function may contain subroutines for timers, GUI g-labels, menu items, and similar features. This is generally done to encapsulate them in a separate file for use with #Include, which prevents them from interfering with the script's auto-execute section. However, such subroutines should use only static and global variables (not locals) if their function is ever called normally. This is because a subroutine thread that interrupts a function-call thread (or vice versa) would be able to change the values of local variables seen by the interrupted thread. Furthermore, any time a function returns to its caller, all of its local variables are made blank to free their memory. Finally, when a function is entered by a subroutine thread, any references to dynamic variables made by that thread are treated as globals (including commands that create arrays). |
Gruß
Boskoop |
|
| Nach oben |
|
 |
BoBo Gast
|
Verfasst am: So Jan 07, 2007 8:39 pm Titel: |
|
|
| Zitat: | | Leider funktioniert der von Dir vorgeschlagene Code nicht. | Getestet. Funzt!
| Zitat: | | Leider funktioniert der von Dir vorgeschlagene Code nicht in meinem Beispiel/Fall. | Das stimmt! |
|
| Nach oben |
|
 |
|
|
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|