Die im Code aufgerufene Funktion ImageSearch() kommt aus der "ImageSearchDLL.dll", die im Anhang ist.
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.
Also:
* die
DLL Funktion (die natürlich multithreading sicher ist
) 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:
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;
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.