![]() |
Einen ThreadCounter setzten / Thread besser verstehen.
Ich versuche eine Procedure in einen Thread zustarten. Dazu verwende ich diesen Code:
Delphi-Quellcode:
Wenn ich jetzt mehrfach Button1 drücke, werden mehrere Threads gestartet, die auch abgearbeit werden. Ich möchte jetzt aber auch noch in der Listbox sehen, welcher "Schleifendurchlauf" zu welchem (gestarten) Thread gehört. So wie das Programm derzeit aufgebaut ist wird mir der "COUNTER" nicht richtig angezeigt.
var
COUNTER: Integer = 0; //////////////////////////////////////////////////////////////////////////////// procedure StarteThread; var I: Integer; begin I :=0; for I := 0 to 100 do begin Form1.ListBox1.Items.Add('Thread: '+IntToStr(COUNTER)+' Schleifendurchlauf: '+IntToStr(I)); SendMessage(Form1.ListBox1.Handle,WM_VSCROLL,SB_BOTTOM,0); Sleep(100); end; end; //////////////////////////////////////////////////////////////////////////////// procedure TForm1.Button1Click(Sender: TObject); var TID: cardinal; begin Inc(COUNTER, 1); CreateThread(0,0,@StarteThread,0,0,TID); end; //////////////////////////////////////////////////////////////////////////////// |
Re: Einen ThreadCounter setzten / Thread besser verstehen.
nach dem der neue Thread angelaufen ist, must Du dort in einer lokalen Variable den Zählerstand zum Zeitpunkt des Thread-Startes zwischenspeichern....
ansonsten gilt der Wert der globalen Variable für jeden Thread und jeden Schleifendurchgang...
Delphi-Quellcode:
var
COUNTER: Integer = 0; //////////////////////////////////////////////////////////////////////////////// // procedure StarteThread; // Korrekte Signatur ist: Function StarteThread(Parameter : Pointer) : LongWord; StdCall; var ID, I: Integer; begin ID := InterlockedIncrement(COUNTER); // Zähler atomar (unteilbar, serialisiert) inkrementieren, und Resultat zwischenspeichern for I := 0 to 100 do begin Form1.ListBox1.Items.Add('Thread: '+IntToStr(ID)+' Schleifendurchlauf: '+IntToStr(I)); // dies ist unschön, da VCL nicht thread-safe... Quelle für lästige Bugs... // bei produktiven Anwendungen mittels Synchronize() auskoppeln, oder ganz auf Messages umstellen SendMessage(Form1.ListBox1.Handle,WM_VSCROLL,SB_BOTTOM,0); Sleep(100); end; end; //////////////////////////////////////////////////////////////////////////////// procedure TForm1.Button1Click(Sender: TObject); var TID: cardinal; begin CreateThread(0,0,@StarteThread,0,0,TID); end; //////////////////////////////////////////////////////////////////////////////// |
Re: Einen ThreadCounter setzten / Thread besser verstehen.
Danke für Deine Mühen. Geht einwandfrei!
|
Re: Einen ThreadCounter setzten / Thread besser verstehen.
Hi,
man sollte aber BeginTread und nicht CreatThread benutzen.
Delphi-Quellcode:
Mfg ReDoX
procedure TForm1.Button1Click(Sender: TObject);
var ThreadID: Cardinal; ThreadHandle: HWND; begin ThreadHandle := BeginThread(nil, 0, TFNThreadStartRoutine(@StarteThread), nil, 0, ThreadID); if ThreadHandle <> 0 then CloseHandle(ThreadHandle); end; |
Re: Einen ThreadCounter setzten / Thread besser verstehen.
Guten Morgen,
wie muß ich das denn machen, bzw welches sollte die besser Methode sein, um der Thread-Funktion einen String zu übergeben? Ich habe bei Modifikationen immer nur Fehlermeldungen erhalten.... |
Re: Einen ThreadCounter setzten / Thread besser verstehen.
Guck dir mein Thread Tutorial an:
![]() |
Re: Einen ThreadCounter setzten / Thread besser verstehen.
hi Luckie...
Dein Tut habe ich doch schon.... vor meinem Posting gehabt. Die ganzen Zusatzinformationen sind einfach schon wieder zuviel des Guten. Aber ich werde solange darein schauen bis ich es verstanden habe. //Edit: 2 Stunden später: *g |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:32 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