Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Einen ThreadCounter setzten / Thread besser verstehen. (https://www.delphipraxis.net/44932-einen-threadcounter-setzten-thread-besser-verstehen.html)

Harry M. 27. Apr 2005 00:01


Einen ThreadCounter setzten / Thread besser verstehen.
 
Ich versuche eine Procedure in einen Thread zustarten. Dazu verwende ich diesen Code:
Delphi-Quellcode:
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;
////////////////////////////////////////////////////////////////////////////////
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.

Basilikum 27. Apr 2005 00:52

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;
////////////////////////////////////////////////////////////////////////////////

Harry M. 27. Apr 2005 00:58

Re: Einen ThreadCounter setzten / Thread besser verstehen.
 
Danke für Deine Mühen. Geht einwandfrei!

ReDoX 27. Apr 2005 06:18

Re: Einen ThreadCounter setzten / Thread besser verstehen.
 
Hi,
man sollte aber BeginTread und nicht CreatThread benutzen.
Delphi-Quellcode:
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;
Mfg ReDoX

Harry M. 27. Apr 2005 08:11

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....

Luckie 27. Apr 2005 13:25

Re: Einen ThreadCounter setzten / Thread besser verstehen.
 
Guck dir mein Thread Tutorial an: http://tutorials.luckie-online.de , wird gezeigt, wie man Parameter an einen Thread übergibt.

Harry M. 27. Apr 2005 13:49

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