Wenn dies Ihr erster Besuch hier ist,
lesen Sie bitte zuerst die Hilfe - Häufig gestellte Fragen
durch. Sie müssen sich vermutlich registrieren,
bevor Sie Beiträge verfassen können. Klicken Sie oben auf 'Registrieren', um den Registrierungsprozess zu
starten. Sie können auch jetzt schon Beiträge lesen. Suchen Sie sich einfach das Forum aus, das Sie am meisten
interessiert.
Announcement
Collapse
No announcement yet.
zu was ist ein thread gut und wie programmiere ich einen thread?
ein Thread ist ein <i>Programmausführungspfad</i>, der unabhängig vom primären Thread der Anwendung vom Windows-Scheduler regelmäßig Rechenzeit zugeteilt bekommt. Angenommen, in einer Anwendung rufst Du eine Funktion auf, die ca. 60 Sekunden benötigt. Ohne zweiten Thread ist in dieser Zeit die Anwendung <b>eingefroren</b>, d.h. die Anwendung kann nicht mehr auf Benutzereingaben oder Windows-Botschaften reagieren. Wenn zum Beispiel das Programm <i>Microsoft Word</i> keinen zweiten Thread für das Drucken verwenden würde, könnte der Anwender nach dem Druckbeginn für ein sehr umfangreiches Dokument minutenlang nicht mehr mit Word arbeiten. Allerdings geht Word sehr reichlich mit Threads um.
Delphi vereinfacht mit der Klasse <b>TThread</b> den Einsatz und stellt auch einen Wizard bereit, der das Grundgerüst generiert. Suche am besten im Demos-Unterverzeichnis nach dem Wort "TThread" - dort sollten Beispiele zu finden sein (ob die allerdings bereits schon bei Delphi 2 dabei waren, kann ich aber nicht versprechen).
In meinem Buch <i>Delphi 3 Lösungen</i> hat sich ein umfangreicher Teil mit dem Einsatz von Threads beschäfigt
klingt wirklich brauchbar, der Thread. Kann mir hier jemand die Bedeutung der Funktion BeginThread und der Übergabeargumente erklaeren ?
Leider haelt sich die Online-hilfe hier sehr bedeckt :-/
mit Delphi besteht kein Grund, die Funktion <b>BeginThread</b> aus der Unit System direkt aufzurufen, da dies <b>TThread</b> automatisch erledigt. Und in dieser VCL-Unit ist auch das Delphi-Beispiel für den Aufruf von BeginThread zu finden:
<pre>
constructor TThread.Create(CreateSuspended: Boolean);
var
Flags: DWORD;
begin
inherited Create;
AddThread;
FSuspended := CreateSuspended;
Flags := 0;
if CreateSuspended then Flags := CREATE_SUSPENDED;
FHandle := BeginThread(nil, 0, @ThreadProc, Pointer(Self), Flags, FThreadID);
end;
</pre>
BeginThread ruft die API-Funktion <b>CreateThread</b> auf - und die wird in der SDK-Hilfe dokumentiert:
<pre>
function BeginThread(SecurityAttributes: Pointer; StackSize: LongWord;
ThreadFunc: TThreadFunc; Parameter: Pointer; CreationFlags: LongWord;
var ThreadId: LongWord): Integer;
var
P: PThreadRec;
begin
New(P);
P.Func := ThreadFunc;
P.Parameter := Parameter;
IsMultiThread := TRUE;
Result := CreateThread(SecurityAttributes, StackSize, @ThreadWrapper, P,
CreationFlags, ThreadID);
end;
</pre>
was laesst sich mit den Flags der Funktion BeginThread anstellen,
in der SDK-Hilfe steht (bei mir) nur :
dwCreationFlags
Specifies additional flags that control the creation of the thread. If the CREATE_SUSPENDED flag is specified, the thread is created in a suspended state, and will not run until the ResumeThread function is called. If this value is zero, the thread runs immediately after creation. At this time, no other values are supported.
der Parameter <b>dwCreationFlags</b> legt fest, ob der Thread sofort anlaufen soll. Und <b>Pointer(self)</b> ist ein frei wählbarer Parameter, der an die Threadfunktion weitergegeben wird. Die VCL übergibt den Selfzeiger als 32-Bit-Adresse (falls jemand später diesen benötigt)
Comment