AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Einen ThreadCounter setzten / Thread besser verstehen.
Thema durchsuchen
Ansicht
Themen-Optionen

Einen ThreadCounter setzten / Thread besser verstehen.

Ein Thema von Harry M. · begonnen am 27. Apr 2005 · letzter Beitrag vom 27. Apr 2005
Antwort Antwort
Benutzerbild von Harry M.
Harry M.

Registriert seit: 29. Okt 2004
Ort: Halle
462 Beiträge
 
#1

Einen ThreadCounter setzten / Thread besser verstehen.

  Alt 27. Apr 2005, 00:01
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.
Harry
Gruß Harry
www.H-Soft.info
  Mit Zitat antworten Zitat
Basilikum

Registriert seit: 9. Aug 2003
389 Beiträge
 
Delphi 7 Professional
 
#2

Re: Einen ThreadCounter setzten / Thread besser verstehen.

  Alt 27. Apr 2005, 00:52
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;
////////////////////////////////////////////////////////////////////////////////
  Mit Zitat antworten Zitat
Benutzerbild von Harry M.
Harry M.

Registriert seit: 29. Okt 2004
Ort: Halle
462 Beiträge
 
#3

Re: Einen ThreadCounter setzten / Thread besser verstehen.

  Alt 27. Apr 2005, 00:58
Danke für Deine Mühen. Geht einwandfrei!
Harry
Gruß Harry
www.H-Soft.info
  Mit Zitat antworten Zitat
ReDoX
(Gast)

n/a Beiträge
 
#4

Re: Einen ThreadCounter setzten / Thread besser verstehen.

  Alt 27. Apr 2005, 06:18
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
  Mit Zitat antworten Zitat
Benutzerbild von Harry M.
Harry M.

Registriert seit: 29. Okt 2004
Ort: Halle
462 Beiträge
 
#5

Re: Einen ThreadCounter setzten / Thread besser verstehen.

  Alt 27. Apr 2005, 08:11
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....
Harry
Gruß Harry
www.H-Soft.info
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Einen ThreadCounter setzten / Thread besser verstehen.

  Alt 27. Apr 2005, 13:25
Guck dir mein Thread Tutorial an: http://tutorials.luckie-online.de , wird gezeigt, wie man Parameter an einen Thread übergibt.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Harry M.
Harry M.

Registriert seit: 29. Okt 2004
Ort: Halle
462 Beiträge
 
#7

Re: Einen ThreadCounter setzten / Thread besser verstehen.

  Alt 27. Apr 2005, 13:49
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
Harry
Gruß Harry
www.H-Soft.info
  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 07:59 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz