Thread unterbrechen

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

User avatar
Holle
Posts: 187
Joined: 01 Oct 2013, 23:19

Thread unterbrechen

13 Nov 2013, 07:45

Irgendwie bekomme ich das nicht hin einen Thread zu unterbrechen.
Der Befehl "Thread" ist mir bekannt, aber wenn ich z.b. "Thread, Interrupt,1,1" verwende kann ich den Thread trotzdem nicht unterbrechen.

Hier ist mal ein Beispiel-Script:

Code: Select all

#SingleInstance

label:
Thread, interrupt, 1, 1
	Loop, 100 {
		Sleep 50
		TrayTip,, % a_index " von 100"
	}
return

F7::gosub label
Wenn ich das Script starte erscheint ein TrayTip mit einem Zähler. Wenn ich nun F7 drücke beginnt der Zähler wieder bei 1 (also wurde der Thread neu gestartet ...genau so möchte ich es auch haben).
Wenn ich den Thread nun jedoch noch einmal unterbrechen will klappt das nicht mehr (nur ein mal nach dem Programmstart, danach nicht mehr)

Hat jemand eine Idee wie ich das hin bekomme, dass ich den Thread beliebig oft mit F7 von vorne beginnen lassen kann?
Danke...
strobo
Posts: 125
Joined: 30 Sep 2013, 15:24

Re: Thread unterbrechen

13 Nov 2013, 08:00

Ungetestet, vllt #MaxThreadsPerHotkey hochsetzen?
User avatar
Holle
Posts: 187
Joined: 01 Oct 2013, 23:19

Re: Thread unterbrechen

13 Nov 2013, 08:11

Vielen Dank, das funktioniert.

Nun habe ich aber ein anderes Problem, vielleicht hat da ja auch jemand eine Idee.
Mein Ursprungsproblem liegt darin, dass mein Script bei einer Auswahl etwas berechnet, was einige Sekunden dauern kann.
Wenn ich während dieser Zeit eine andere Auswahl treffe soll die Funktion unterbrochen und neu gestartet werden.
Mit meinem Test-Script wollte ich genau das erreichen, aber nun sehe ich dass dies zwei verschiedene paar Schuhe sind.

Zum einen wird die Funktion nicht durch einen HotKey aufgerufen, sondern durch eine andere Funktion (ausgelöst durch eine Auswahl in einer ListBox) und zum anderen soll die Funktion nicht "pausieren" und nach beendigung des neuen Threads fortgesetzt werden, sondern die Funktion soll einfach beendet (return) und neu gestartet werden.

Mit "Thread, interrupt, 0" , "Critical, off" oder "Thread, priority, -1000" usw. komme ich da nicht wirklich weiter.
Vielleicht verwende ich die Befehle bloß falsch, oder vielleicht funktioniert das auch nicht wenn der Aufruf der Funktion von einer anderen Funktion erfolgt.

Da muss ich wohl erst ein neues Beispielscript erstellen.
Soweit schon mal vielen Dank. Falls jemand jetzt schon versteht was ich meine und ahnt wo mein Fehler liegt bin ich selbstverständlich über jeden Hinweis dankbar :-)


Edit: Das mit dem Aufruf aus einer anderen Funktion scheint kein Problem zu sein, aber wie bekomme ich es hin, dass der Thread "beendet und neu gestartet" wird, statt "pausiert während der neue Thread läuft" ?
Hier ist das BeispielScript:

Code: Select all

#SingleInstance
#MaxThreadsPerHotkey 10

label:
	Loop, 100 {
		Sleep 50
		TrayTip,, % a_index " von 100"
	}
return

label2:
	gosub label
return

F7::gosub label2
just me
Posts: 9485
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Thread unterbrechen

13 Nov 2013, 08:28

Code: Select all

#NoEnv
#SingleInstance
SleepTime := 100

Label:
   Stop := False
   Loop, 100 {
     Sleep, %SleepTime%
     TrayTip, , % A_index . " von 100"
   } Until Stop
Return

F7::  ; oder auch Label1:
   Stop := True
   Sleep, %SleepTime%
   SetTimer, Label, -1
Return
?
strobo
Posts: 125
Joined: 30 Sep 2013, 15:24

Re: Thread unterbrechen

13 Nov 2013, 08:36

1) die zu unterbrechende funktion immer wieder einen break-parameter abfragen lassen.
2) AHK_H bzw ahk.dll.
3) temporäres skript starten, kann man dann auf wunsch beenden.
Wenn du was anderes findest, wärst du, soweit ich weiß, der erste.
User avatar
Holle
Posts: 187
Joined: 01 Oct 2013, 23:19

Re: Thread unterbrechen

13 Nov 2013, 08:42

Vielen Dank, just me!
Das funktioniert mit meinem Beispielscript hervorragend.

Leider ist das Script in dem ich das benötige etwas komplexer und besteht nicht nur aus einer Loop.
Notfalls kann ich alle 20 Zeilen das einfügen:

Code: Select all

if Stop
    return
...aber sonderlich schön und übersichtlich wäre das nicht.

Meine Funktion berechnet halt einiges, und das kann je nach Umfang ein paar Sekunden in Anspruch nehmen. Wenn in dieser Zeit eine andere Auswahl getroffen wird sollte die Funktion einfach mit der neuen Auswahl "erneuert" werden.

Gibt es da noch andere Möglichkeiten? Die Loop in meinem Beispiel dient nur der Simulation der "Berechnungszeit" in welcher u.U. eine andere Auswahl getroffen wird.

strobo wrote:1) die zu unterbrechende funktion immer wieder einen break-parameter abfragen lassen.
2) AHK_H bzw ahk.dll.
3) temporäres skript starten, kann man dann auf wunsch beenden.
Wenn du was anderes findest, wärst du, soweit ich weiß, der erste.
Na das ist doch mal ein Anreiz ...einmal der erste zu sein ;-)
Ne, Spaß beiseite ...
Punkt 1 verstehe ich soweit (alle x Zeilen ein "if stop --> return" einbauen. Das wären einige Abfragen, da meine Funktion ein paar Hundert Zeilen hat.
...aber was meinst du mit AHK_L und ahk.dll , bzw. wie benutze ich das um eine Funktion neu zu starten?
Und wie darf ich das mit dem temporärem Script verstehen?
just me
Posts: 9485
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Thread unterbrechen

13 Nov 2013, 08:52

strobo wrote:1) die zu unterbrechende funktion immer wieder einen break-parameter abfragen lassen.
2) AHK_H bzw ahk.dll.
3) temporäres skript starten, kann man dann auf wunsch beenden.
Wenn du was anderes findest, wärst du, soweit ich weiß, der erste.
Mehr fällt mir dazu auch nicht ein.

Edit: "temporäres skript starten" mein wohl ein externes Skript, das per Run gestartet und per Process, Close wieder beendet werden kann.
User avatar
Holle
Posts: 187
Joined: 01 Oct 2013, 23:19

Re: Thread unterbrechen

13 Nov 2013, 08:59

Hmmm, das mit dem temporären Script dürfte dann schwierig werden, denn zum einen werden massig Variablen übergeben/verändert und zum anderen werden Bilder erzeugt, welche in verschiedenen GUIs angezeigt werden (samt Overlays, usw.).

Da werde ich dann wohl doch alle x Zeilen ein "if stop ---> return" einpflanzen müssen.

Vielen Dank euch beiden.
User avatar
Holle
Posts: 187
Joined: 01 Oct 2013, 23:19

Re: Thread unterbrechen

14 Nov 2013, 05:56

Ich habe das nun so gelöst (falls jemand mal etwas ähnliches vor hat) :

Code: Select all

StopCheck:
	ControlGet, Auswahl, Choice, , , ahk_id %hLB%	
	if (Auswahl != Auswahl_vorher) {
		Stop := true
		Auswahl_vorher := Auswahl
		SetTimer, StopCheck, off
		SetTimer, NeuLaden, -200
	}
	else 
		Stop := false
return

NeuLaden:
	GuiControl, ChooseString , Auswahl, |%Auswahl%
return

Label:
	Stop := false
	ControlGet, Auswahl, Choice, , , ahk_id %hLB%
	Auswahl_vorher := Auswahl ; prüfen ob sich während der Erstellung der Vorschau die Auswahl geändert hat.
	SetTimer, StopCheck, 100
	; ...
	; hier ist das eigentliche Script
	if stop
		return
	; hier ist immer noch das eigentliche Script
	if stop
		return
	; usw.
	; ...
	SetTimer, StopCheck, off
return

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: No registered users and 27 guests