Jump to content

Sky Slate Blueberry Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate
Photo

Code auf Schnelligkeit optimieren. Ideen?



  • Please log in to reply
7 replies to this topic
Spoons
  • Members
  • 13 posts
  • Last active: Dec 19 2014 12:55 PM
  • Joined: 12 Dec 2014

Hey,

wollte euch mal Fragen ob ihr vielleicht noch ein paar Ideen zur Optimierung des Codes auf Schnelligkeit habt. Das Script arbeitet leider ein bisschen zu langsam.

 

Code:

Octave := 2

MatchList1 := "q,w,e,r,t,z,u,i"
MatchList2 := "a,s,d,f,g,h,j,k"
MatchList3 := "y,x,c,v,b,n,m,_"
tab := {}
loop, 3
{
  ind := a_index
  loop, parse, matchlist%ind%, `,
  {
    tab[a_loopfield] := a_index
  }
}

Loop
{
Input, SingleKey, L1,{F1}
CopiedKey := 0


	if SingleKey in %MatchList1%
	{
		CopiedKey := tab[SingleKey]
		if (Octave = 1) 
			{
			Send %CopiedKey%
			Octave = 1
			continue
			}
		else if (Octave = 2) 
			{
			Send 9
			Send %CopiedKey%
			Octave = 1
			continue
			}
		else if (Octave = 3) 
			{
			Send 9
			Send 9
			Send %CopiedKey%
			Octave = 1
			continue
			}
	
	}

	if SingleKey in %Matchlist2%
	{
		CopiedKey := tab[SingleKey]
		if (Octave = 1) 
			{
			Send 0
			Send %CopiedKey%
			Octave = 2
			continue
			}
		else if (Octave = 2) 
			{
			Send %CopiedKey%
			Octave = 2
			continue
			}
		else if (Octave = 3) 
			{
			Send 9
			Send %CopiedKey%
			Octave = 2
			continue
			}
	}
	
	if SingleKey in %Matchlist3%
	{
		CopiedKey := tab[SingleKey]
		if (Octave = 1)
			{
			Send 0
			Send 0
			Send %CopiedKey%
			Octave = 3
			continue
			}
		else if (Octave = 2) 
			{
			Send 0
			Send %CopiedKey%
			Octave = 3
			continue
			}
		else if (Octave = 3) 
			{
			Send %CopiedKey%
			Octave = 3
			continue
			}
	
	}
	
	
	if errorlevel = Endkey:F1
	{		
		ExitApp
	}
}
ExitApp
Return

Ein bisschen Info zum Script: Die Tasten Q bis P, A bis K und Y bis , sind jeweils mit den Nummern 1 bis 8 belegt. Das Script überprüft je nach Eingabe welche Taste aus welcher Reihe gedrückt wurde und ändert wenn nötig die Oktaven indem es zusätzlich noch die 9 oder 0 sendet. (Script dient für ein Spiel)

 

Vielen Dank für jede Hilfe!

 

MfG



nnnik
  • Members
  • 1625 posts
  • Last active: Jan 24 2019 02:19 PM
  • Joined: 28 Jul 2012
Setzte mal ein SetBatchlines,-1 an den Anfang deines Scriptes.

Visit the new forum ahkscript.org.

http://ahkscript.org


Spoons
  • Members
  • 13 posts
  • Last active: Dec 19 2014 12:55 PM
  • Joined: 12 Dec 2014

Danke für deine Antwort nnnik, denke mal, dass der Befehl sehr nützlich ist. Leider ist das Script immer noch zu langsam, oder ich suche nach etwas komplett anderem. Und zwar kann es auch manchmal vorkommen, dass 2 oder 3 Eingaben gleichzeitig passieren. Das Script führt dann meistens nur die 1. gedrückte Eingabe aus und die anderen nebenbei und gleichzeitig gedrückten werden vergessen. Gibt es dafür eine Lösung, dass es theoretisch noch schneller funktioniert? Bzw. er mehrere Eingabe gleichzeitig erkennen kann? 



Rohwedder
  • Members
  • 130 posts
  • Last active: Nov 10 2015 03:43 PM
  • Joined: 06 Feb 2013

Du liest ein einzelnes Zeichen ein und suchst dann mühselig in welcher Liste es vorkommt. Verwende vorbesetzte Felder.

Z.B, das Zeichen ist ein a, dann hat Z:=Asc(Zeichen) den Wert 97. Wenn das Feld MLNr an der Stelle 97 eine 2 enthält bekommst du mit Nr := MLNr%Z% sofort die Information daß a in MatchList2 vorkommt ohne lange zu suchen.



Spoons
  • Members
  • 13 posts
  • Last active: Dec 19 2014 12:55 PM
  • Joined: 12 Dec 2014

Du liest ein einzelnes Zeichen ein und suchst dann mühselig in welcher Liste es vorkommt. Verwende vorbesetzte Felder.

Z.B, das Zeichen ist ein a, dann hat Z:=Asc(Zeichen) den Wert 97. Wenn das Feld MLNr an der Stelle 97 eine 2 enthält bekommst du mit Nr := MLNr%Z% sofort die Information daß a in MatchList2 vorkommt ohne lange zu suchen.

 

Ich verstehe dein Beispiel leider nicht ganz. Könntest du mir das nochmal detaillierter beschreiben bzw. kurz anhand eines kleinen Codebeispiels zeigen?

 

 

MfG



Rohwedder
  • Members
  • 130 posts
  • Last active: Nov 10 2015 03:43 PM
  • Joined: 06 Feb 2013
✓  Best Answer
MatchList1 := "q,w,e,r,t,z,u,i"
MatchList2 := "a,s,d,f,g,h,j,k"
MatchList3 := "y,x,c,v,b,n,m,_"
Loop, 3
{ 
	Nr := A_Index
	Loop, Parse, MatchList%Nr%, CSV
	{
		Z:=Asc(A_LoopField)
		MLNr%Z% := Nr
	}
}
; jetzt ist das Feld MLNr gefüllt
Tooltip, Buchstaben eingeben, Abbruch mit F1
Loop
{
	Input, SingleKey, L1,{F1}
	if errorlevel = Endkey:F1
		ExitApp
	Z:=Asc(SingleKey)
	If MLNr%Z%
		Tooltip, % SingleKey " ist in MatchList" MLNr%Z%
	Else
		Tooltip, Kenne ich nicht!
}

Mit freundlichen Grüßen

Rohwedder



Spoons
  • Members
  • 13 posts
  • Last active: Dec 19 2014 12:55 PM
  • Joined: 12 Dec 2014

Hmm, nagut das muss ich mir erstmal genauer anschauen. ^^

 

 

MfG



Gerdi
  • Members
  • 39 posts
  • Last active: Aug 06 2015 11:42 PM
  • Joined: 03 Feb 2013

Hallo Spoons,

 

wenn es bei mir schnell werden soll,

versuche ich meist von den vielen Abfragen weg zu kommen.

Das gelingt häufig über direkte Gosub-Sprünge.

Das Skript wird zwar in der Regel viel schneller,

aber auch viel länger.

 

In deinem Beispiel würde ich zuerst das Zeichen abfragen,

das Ergebnis einer Variablen zuweisen,

egal ob direkt als Zeichen oder als nummerischen ASCII Wert,

nur eindeutig.

Um dann mit einem dynamischen Gosub,

zu einem Label welches den soeben agefragten VariablenNamen enthält,

das eigentliche doing zu erledigen.

 

Wenn ich Dein Skript richtig verstanden habe, könnte dies in etwa so aussehen:

 

Input,Singlkey,L1,{F1}

If(IsLabel("Okt" . Singlkey))

    {

        Gosub Okt%Singlkey%

    }

else

    MsgBox, Hinweis an den Skriptersteller: Label Okt%Singlkey% fehlt noch.

 

gefolgt von vielen Labels

Okta:

; doings for this Label

return 

Oktb:

; doings for this Label

return

Oktc:

...

 

oft lassen sich die Labels auch zusammenfassen,

d.h. mehrere Okt? enthalen gleiche Befehle und enden mit einem return.

Sollte bei Deinen Matchlists klappen.

 

PS. Okt war ein willkürlicher Namensbeginn.

 

Gruss

Gerdi