Deutsches AutoHotkey Homepage AutoHotkey Community
Wir helfen uns gegenseitig aus der Patsche
 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   RegistrierenRegistrieren 
 ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Einfache Scheduler-Funktion

 
Neues Thema eröffnen   Neue Antwort erstellen    AutoHotkey Community Foren-Übersicht -> Skripte & Funktionen
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Boskoop



Anmeldedatum: 18.12.2005
Beiträge: 60

BeitragVerfasst am: Sa Jan 06, 2007 9:26 pm    Titel: Einfache Scheduler-Funktion Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
BoBo
Gast





BeitragVerfasst am: So Jan 07, 2007 12:19 pm    Titel: Antworten mit Zitat

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

BeitragVerfasst am: So Jan 07, 2007 3:51 pm    Titel: Antworten mit Zitat

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 Smile.

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
Benutzer-Profile anzeigen Private Nachricht senden
BoBo
Gast





BeitragVerfasst am: So Jan 07, 2007 8:39 pm    Titel: Antworten mit Zitat

Zitat:
Leider funktioniert der von Dir vorgeschlagene Code nicht.
Shocked Getestet. Funzt! Cool

Zitat:
Leider funktioniert der von Dir vorgeschlagene Code nicht in meinem Beispiel/Fall.
Das stimmt!
Nach oben
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    AutoHotkey Community Foren-Übersicht -> Skripte & Funktionen Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
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