![]() |
Thread für einen Funktionsaufruf erstellen
Hallo Forengemeinde,
Ich habe ein kleines Problem in einem alten Projekt, dass leider noch auf Delphi 7 basiert und mir fehlt die Zeit es für eine neuere Version neu zuschreiben. Trotzdem möchtet ich es gerade etwas auf hübschen und anpassen. Und zwar nutze ich folgenden Funktion relativ häufig in meinem Code, doch leider ist sieh recht leistungsintensiv, weshalb ich sie gerne in ein Thread hätte.
Delphi-Quellcode:
Leider habe ich Delphi Threads nie so richtig verstanden deshalb hoffe ich auf eure Hilfe. Am liebsten wäre mir eine Funktion, die einen Thread erstellt, die Funktion laufen lässt den Thread schließt und mir die Rückgabe liefert.
function _ImageSearch(findImage: string; tolerance: Integer; delay: Integer): Boolean;
var ergebnis : PChar; ergebnis2 : TStringList; oldPos : TPoint; begin if (tolerance > 0) then findImage := '*' + inttostr(tolerance) + ' ' + findImage; ergebnis := ImageSearch(0,0,Screen.Width ,Screen.Height ,PCHAR(findImage)); if (ergebnis[0] = '1') then begin ergebnis2 := split(ergebnis, '|', true); sleep(delay); x := StrToInt(ergebnis2[1]) + round(StrToInt(ergebnis2[3])/2); y := StrToInt(ergebnis2[2]) + round(StrToInt(ergebnis2[4])/2); oldPos := mouse.CursorPos; mouse.CursorPos := point(x+Zufallszahl(-5,5),y+Zufallszahl(-5,5)); mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); mouse.CursorPos := oldPos; //showmessage('found' + inttostr(x) + ' ' + inttostr(y)); result := true end else begin result := false end; end; Ich hoffe ihr könnt mir dabei weiter helfen. Danke und einen lieben Gruß, Fredyy |
AW: Thread für einen Funktionsaufruf erstellen
Der Code schein völlig selbstdokumentierend zu sein, leider verstehe ich die Dokumentation nicht ....
aber der Zugriff auf mouse. und verdachtsweise auf TCanvas in ImageSearch schliessen sinvolle Threadimplementierungen IMHO eh aus. |
AW: Thread für einen Funktionsaufruf erstellen
Liste der Anhänge anzeigen (Anzahl: 1)
Die im Code aufgerufene Funktion ImageSearch() kommt aus der "ImageSearchDLL.dll", die im Anhang ist.
Delphi-Quellcode:
function ImageSearch(aLeft: Integer; aTop: Integer; aRight: Integer; aBottom: Integer; aImageFile: PChar): PChar; stdcall; external 'ImageSearchDLL.dll';
Daher denke ich, dass TCanvas hier kein Problem sein dürfte. Die Mausbewegung könnte ja auch außerhalb des Thread ausgeführt werden, sobald der Thread durch gelaufen ist. Hier habe ich nochmal mit "Pseudo"-Code markiert, wie ich mir erhoffe, dass es funktioniert.
Delphi-Quellcode:
function _ImageSearch(findImage: string; tolerance: Integer; delay: Integer): Boolean;
var ergebnis : PChar; ergebnis2 : TStringList; oldPos : TPoint; begin if (tolerance > 0) then findImage := '*' + inttostr(tolerance) + ' ' + findImage; [THREADSTART] ergebnis := ImageSearch(0,0,Screen.Width ,Screen.Height ,PCHAR(findImage)); [THREADENDE] [WENN THREAD DURCHGELAUFEN ANFANG] if (ergebnis[0] = '1') then begin ergebnis2 := split(ergebnis, '|', true); sleep(delay); x := StrToInt(ergebnis2[1]) + round(StrToInt(ergebnis2[3])/2); y := StrToInt(ergebnis2[2]) + round(StrToInt(ergebnis2[4])/2); oldPos := mouse.CursorPos; mouse.CursorPos := point(x+Zufallszahl(-5,5),y+Zufallszahl(-5,5)); mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); mouse.CursorPos := oldPos; //showmessage('found' + inttostr(x) + ' ' + inttostr(y)); result := true end else begin result := false end; [WENN THREAD DURCHGELAUFEN ENDE] end; |
AW: Thread für einen Funktionsaufruf erstellen
Delphi-Quellcode:
Wenn deine Programmlogik keinen parallelen Ablauf zulässt, was soll dann der Thread für einen Vorteil bringen?
function _ImageSearch(findImage: string; tolerance: Integer; delay: Integer): Boolean;
begin [THREADSTART] [THREADENDE] [WENN THREAD DURCHGELAUFEN ANFANG] [WENN THREAD DURCHGELAUFEN ENDE] end; Im Prinzip währe dieser Ablauf geeignet:
Code:
Hauptthread Workerthread
Ereignis1 -> Thread Starten Ereignis2 -> Was anderes tun arbeitet Ereignis3 -> Was anderes tun löst Ereignis5 aus Ereignis4 -> Was anderes tun beendet Ereignis5 -> Auf Ergebnis des Thread reagieren |
AW: Thread für einen Funktionsaufruf erstellen
Zitat:
* die DLL Funktion (die natürlich multithreading sicher ist :wink:) soll mehrfach aufgerufen werden, jeweils für eine andere Datei / mit anderen Parametern) -> kein Problem * die GUI soll nach Beenden des Threads etwas tun Damit die GUI-Aktivität nichts durcheinanderbringt, kann im Thread synchronize verwendet werden. Der Thread führt den synchronized-Code dann im Kontext des Hauptthreads aus (die anderen Threads laufen weiter, es sei denn sie erreichen ebenfalls den synchronized-Punkt) Pseudo-Code:
Delphi-Quellcode:
in ShowResult kann dann der in deinem Beispiel enthaltene Code verwendet werden. Die Threads werden ihn nicht gleichzeitig ausführen, sondern in Reihenfolge ihrer Fertigestellung.
procedure MyThread.Execute
begin - rufe die DLL Funktion auf - speichere das Ergebnis in einer property des Thread-Objekts MyResult := ImageSearch(0,0,Screen.Width ,Screen.Height ,PCHAR(findImage)); - rufe synchronized eine Thread-Methode auf, die dann eine Methode des Hauptthreads aufruft synchronize(MyResultMethod); end; procedure MyThread.MyResultMethod; begin // wird im MAIN Thread ausgeführt MainForm.ShowResult(MyResult); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:22 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz