AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Threads und Zugreifen auf Controls

Ein Thema von Matze · begonnen am 28. Dez 2005 · letzter Beitrag vom 29. Dez 2005
Antwort Antwort
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#1

Re: Threads und Zugreifen auf Controls

  Alt 29. Dez 2005, 08:12
Zitat von Matze:
Zitat von jbg:
[...] ein wenig überlegen gehört auch zum Programmieren
Das nehme ich persönlich. Auch wenn man es nicht merkt, ich habe Stunden, wirklich Stunden gesucht und gelesen und bin nie auf deine Methode gestoßen.
Wieso hast Du nicht die Online-Hilfe gelesen? Die paar Beispiele im Demo-Verzeichnis von Delphi reichen doch auch aus. Im Übrigen dürfte sich seine Anmerkung auf den nicht getesteten Code beziehen, den man nicht 1:1 übernehmen sollte, weil eben "ein wenig Überlegen" auch "zum Programmieren" gehört. Ehrlich gesagt frage ich mich, wo du gelesen hast. Es gibt übrigens noch andere Quellen außer DP.

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:
Procedure TWorkerThread.Execute;
Begin
  While Not Terminated Do
    If WaitForSingleObject (fMySemaphore,nil,nil, 500) = WAIT_OBJECT_0 do
      DoSomething
End;
Im 'DoSomething' wird dann dein Text verwurstet o.ä.
Zitat von Matze:
Hier liest man so viel über Suspand, Resume, WaitFor aber irgendwie ist alles nichts rechtes.
Das 'WaitForSingleObject' ist Rechtens. Es ist die von Windows empfohlene Methode, weil sie, laut Online-Hilfe (Du erinnerst Dich? ), sehr effektiv ist. Beim Warten wird also so gut wie keine CPU-Zeit verbraten. Das ist also, im Gegensatz zu deinem Gefühl, sehr professionell.

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:
ReleaseSemaphore (fMySemaphore,1,Nil) auf. Eine Semaphore wird z.B. so erzeugt (schau in der Win32-Hilfe nach der Bedeutung der Parameter):
fMySemaphore := CreateSemaphore(NIL, 0, 1, NIL); Da es sich um ein Handle handelt , weisst Du dann auch, wie man es wieder freigibt.

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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:29 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