System-Watcher: als Rudel, oder besser als Einzelkämpfer?

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

Stroker-007
Posts: 135
Joined: 28 Jan 2021, 17:09
Location: Germany

System-Watcher: als Rudel, oder besser als Einzelkämpfer?

Post by Stroker-007 » 26 May 2023, 19:41

Hallo zusammen!

Das sind 2 System-Watcher, die als Rudel arbeiten, also beide (oder mehr...) in einer Datei:

Code: Select all

#Persistent
#NoTrayIcon
Process, Priority,, L

Loop {

WinWait, Dieses Fenster mag ich nicht,, 1
if ErrorLevel = 0 
{
   WinClose, Dieses Fenster mag ich nicht
   SplashImage, c:\Y\AHK-Skript\SplashImage-01.JPG, b
   sleep 200
   SplashImage off
   sleep 200
   SplashImage, c:\Y\AHK-Skript\SplashImage-01.JPG, b
   sleep 200
   SplashImage off
}

WinWait, FEHLER!,, 1
if ErrorLevel = 0
   WinClose, FEHLER!

}

Das sind dieselben beiden Geheimdienstler, die aber als Einzelkämpfer nebeneinander/gleichzeitig/unabhängig im System laufen:

Code: Select all

#Persistent
#NoTrayIcon
Process, Priority, , L

Loop {
WinWait, Dieses Fenster mag ich nicht,, 1
WinClose, Dieses Fenster mag ich nicht

SplashImage, c:\Y\AHK-Skript\SplashImage-01.JPG, b
sleep 200
SplashImage off
sleep 200
SplashImage, c:\Y\AHK-Skript\SplashImage-01.JPG, b
sleep 200
SplashImage off
}

Code: Select all

#Persistent
#NoTrayIcon
Process, Priority, , L

Loop {
WinWait, FEHLER!,, 1
WinClose, FEHLER!
}

Meine Frage ist nun: Welche Variante ist effizienter, resoursen-schonender, skript-formal löblicher etc. pp.:
Der Rudelwatch - oder als Einzelkämpfer?
Klar, innerhalb 1 Datei muß nacheinander abgearbeitet werden, bei unabhängigen Einzelprozessen läuft das synchron.
Im Vergleich hab ich aber keinen zeitlichen Unterschied "wahrgenommen".

Kann WinWait innerhalb eines Prozesses (Datei) mehrfach und synchron laufen?
Müßte/könnte/sollte das mit Timern gemacht werden? Würde das einen Vorteil gegenüber Einzelkämpfern bringen?

Noch krasser ist/wäre die Frage damit:

Code: Select all

#Persistent
#NoTrayIcon
Process, Priority, , L
SendMode input

again:
CoordMode Pixel
sleep 1000

ImageSearch, XPos, YPos, 534, 338, 678, 457, c:\Y\AHK-Skript\ZweiMonitore.bmp
if errorLevel = 0
   goto FritzboxAnmeldung  
ImageSearch, XPos, YPos, 416, 468, 690, 534, c:\Y\AHK-Skript\Cancel-1234.bmp
if errorLevel = 0
   goto 1234-Cancel
ImageSearch, XPos, YPos, 300, 681, 597, 753, c:\Y\AHK-Skript\Cancel-5678.bmp
if errorLevel = 0
   goto 5678-Cancel
goto again

FritzboxAnmeldung:
CoordMode Mouse
BlockInput On
MouseMove 849, 688, 0
click
send [Passwort]
sleep 100
send {enter}
goto MenuTray

1234-Cancel:
CoordMode Mouse
MouseGetPos PosX, PosY
BlockInput On
MouseMove 1180, 282, 0
click
MouseMove, %PosX%, %PosY%, 0
goto MenuTray

5678-Cancel:
CoordMode Mouse
MouseGetPos PosXX, PosYY
BlockInput On
MouseMove 1361,431, 0
click
MouseMove, %PosXX%, %PosYY%, 0
;goto MenuTray

MenuTray:
BlockInput Off
Menu, Tray, Icon
sleep 10000
Menu, Tray, NoIcon
goto again

Läuft einwandfrei so. Oder wären auch da Einzelkämpfer professioneller/schneller? Oder sonstwas für ein Argument?
Könnte/sollte dieses Skript optimiert werden?

Verschiedene Betrachtungen zu System-Watchern also.
Alle Arten von Ideen oder Hinweisen dazu sind willkommen!
Wie macht ihr sowas, vom Konzept her?

Grüße...

just me
Posts: 9424
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: System-Watcher: als Rudel, oder besser als Einzelkämpfer?

Post by just me » 27 May 2023, 06:59

Moin,

die Anweisung WinWait hält das komplette Skript bis zum Ablauf der Wartezeit an. D.h., wenn das Fenster nicht erscheint, verplempert das Skript 1 Sekunde im Wartezustand. Wenn es wir bei Deinen ersten beiden Beispielen nur um wenige Fenster geht, die per Titel identifiziert werden, kannst Du die in einer Fenstergruppe zusammenfassen und WinWait auf die komplette Gruppe loslassen. Weil WinWait bei Erfolg das "zuletzt gefundene Fenster aktualisiert", kannst Du das gefundene Fenster anschließend mit WinGetTitle, FensterTitel eindeutig bestimmen.

Dein letztes Beispiel ist so nicht zu empfehlen. Meine Kritik beginnt damit, dass Du nicht mit einer Schleife (Loop) sondern mit einer "sich selbst in den Schwanz beißenden" Goto Kette arbeitest. Außerdem hast Du bei einem Treffer eine Wartezeit von über 11 Sekunden, bis die Suche wieder startet. Wenn Dich das nicht stört, kannst Du es so lassen, es funktioniert.

Generell würde ich in einem Skript nur Funktionen zusammenfassen, die sich nicht gegenseitig blocken oder nur mit viel Aufwand davon abgehalten werden können.

Stroker-007
Posts: 135
Joined: 28 Jan 2021, 17:09
Location: Germany

Re: System-Watcher: als Rudel, oder besser als Einzelkämpfer?

Post by Stroker-007 » 28 May 2023, 13:06

Danke just me für die Hinweise!

Dein letzter Absatz/Satz: Darf ich das so verstehen, daß es im Zweifelsfall immer besser ist, solche Vorgänge als jeweils separate Prozeduren während einer Windows-Sitzung im Hintergrund "lauern" zu lassen? Und daß ich mich über ein (für mich unsichtbares) AHK-Prozess-Tohuwabohu (vielleicht werden es ja auch mal an die 20 Stück) nicht zu besorgen brauche?

Füge noch hinzu: Also totaler Anfänger hatte ich vor gut 2 Jahren mal angefragt, ob es denn nötig sei, für jeden einzelnen Hotkey, den man am Start hat, je einen einzelnen Prozess und somit je ein weiteres grünes "H" im Systray vorfinden zu müssen, und dann wäre ja plötzlich der ganze Systray voller H´s. Hatte dann aber schnell begriffen, daß/wie man alle Hotkeys samt -strings fein säuberlich in eine einzige Datei schreiben und dann nur diese zu starten braucht.

Meine jetzige Frage und die dazu gezeigten (und bisher zufriedenstellend laufenden) Skripte geht in eine ähnliche Richtung, wobei mir der faktische Unterschied durchaus klar ist.

Post Reply

Return to “Ich brauche Hilfe”