![]() |
Re: Threads und Zugreifen auf Controls
Zitat:
Zitat:
|
Re: Threads und Zugreifen auf Controls
Zitat:
Zitat:
Zitat:
|
Re: Threads und Zugreifen auf Controls
Zitat:
Hier liest man so viel über Suspand, Resume, WaitFor aber irgendwie ist alles nichts rechtes. |
Re: Threads und Zugreifen auf Controls
Probiere es mal so (Code funktioniert natürlich nicht 1:1, ein wenig überlegen gehört auch zum Programmieren):
Delphi-Quellcode:
type
TMyThread = class(TThread) private FText: string; protected procedure Execute; override; public constructor Create(const AText: string); end; { TMyThread } constructor TMyThread.Create(const AText: string); begin FText := AText; // initialisieren inherited Create(False); // und starten FreeOnTerminate := True; end; procedure TMyThread.Execute; begin // FText ist hier nun verfügbar CalculateQuickbarArray(FText); // FText statt myMemo.Text an ParseRegExpr() übergeben Synchronize(ParseQuickBar); // ParseQuickBar sollte nicht mehr viel machen! end; ... type TForm1 = class(TForm) ... private FMyThread: TMyThread; procedure MyThreadTerminated(Sender: TObject); end; procedure TForm1.MyThreadTerminated(Sender: TObject); begin FMyThread := nil; // neuen Thread in MyMomeKeyDown() erlauben end; procedure TForm1.MyMemoKeyDown(...) begin if not Assigned(FMyThread) then // wenn im Moment kein anderer Thread läuft ... begin FMyThread := TMyThread.Create(myMemo.Text); // ... einen neuen Thread starten FMyThread.OnTerminate := MyThreadTerminate; end; end; |
Re: Threads und Zugreifen auf Controls
Hallo Andreas,
nun geht es deutlich besser als vorhin und ruckelt kaum noch. Das bisschen ligt nun sicher an der Funktion, die ich mit Synchronize aufrufe, das optimiere ich noch etwas. Vielen Dank. :thumb: Zitat:
|
Re: Threads und Zugreifen auf Controls
Zitat:
So, nun zum Fachlichen: Du solltest einen Workerthread erzeugen. Der wartet, bis etwas zu tun ist, verrichtet seine Arbeit und wartet dann wieder.
Delphi-Quellcode:
Im 'DoSomething' wird dann dein Text verwurstet o.ä.
Procedure TWorkerThread.Execute;
Begin While Not Terminated Do If WaitForSingleObject (fMySemaphore,nil,nil, 500) = WAIT_OBJECT_0 do DoSomething End; Zitat:
Das 'fMySemaphore' ist eine Semaphore, die man zur Kommunikation mit Threads verwenden kann: Eine Semaphore ist sowas wie ein threadsicher Zähler, und WaitForSingleObject wartet drauf, das der Zähler <> 0 ist. Dann wird der Zähler um 1 verringert und die Funktion verlassen (Steht alles in der OH). Wenn man will, das der Workerthread arbeiten soll, muss man nur die Semaphore hochzählen. Das geht dann mit 'ReleaseSemaphore', die die Semaphore hochzählt. So kann man -auch über Prozessgrenzen hinweg- einen Thread anstossen. Um dem Thread also mitzuteilen, das er arbeiten soll, rufst Du einfach:
Delphi-Quellcode:
auf. Eine Semaphore wird z.B. so erzeugt (schau in der Win32-Hilfe nach der Bedeutung der Parameter):
ReleaseSemaphore (fMySemaphore,1,Nil)
Delphi-Quellcode:
Da es sich um ein Handle handelt :stupid:, weisst Du dann auch, wie man es wieder freigibt.
fMySemaphore := CreateSemaphore(NIL, 0, 1, NIL);
Wesentlich resourcenschonender, sozusagen die Leichtgewichtsvariante, ist eine 'Critical Section', die, man ahnt es kaum, in der OH sehr ausführlich beschrieben wird. Mit Suspend und Resume kann man einen Thread auch steuern, aber *das* ist dann nicht sehr professionell. |
Re: Threads und Zugreifen auf Controls
Hallo alzaimar,
Ich habe gegoogelt, was das zeug hält aber du hast Recht, in die OH habe ich nicht geschaut. :oops: Danke für deine Erläuterungen, mal testen, was da nun performanter ist. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:36 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