AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Mehr als ein laufendes TThread-Objekt führt zum Einfrieren

Mehr als ein laufendes TThread-Objekt führt zum Einfrieren

Ein Thema von christian_r · begonnen am 17. Dez 2008 · letzter Beitrag vom 17. Dez 2008
Antwort Antwort
christian_r
(Gast)

n/a Beiträge
 
#1

Mehr als ein laufendes TThread-Objekt führt zum Einfrieren

  Alt 17. Dez 2008, 01:59
Seit langer Zeit mal wieder ... Hallo, guten Morgen.

Ich probiere mich gerade das erste Mal an Threads aus. Hier der Code für ein kleines Test-Programm.

Delphi-Quellcode:
unit unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Buttons;

type
  // Counter-ThreadObjekt
  TThreadCounter = class( TThread )
   private
    threadLabel : TLabel;
    count : Integer;
   protected
    procedure Show
                ( );
    procedure Execute
                ( );
                override;
  end;

  TForm1 = class( TForm )
    Button1 : TButton;
    Button2 : TButton;
    Label1 : TLabel;
    Label2 : TLabel;
    procedure Button1Click
                 ( Sender : TObject );
    procedure Button2Click
                 ( Sender : TObject );
   private
    counter1 : TThreadCounter;
    statCounter1 : Boolean;
    counter2 : TThreadCounter;
    statCounter2 : Boolean;
    procedure createThreadCounter
                 ( var pThreadCounter : TThreadCounter; var pStatCounter : Boolean; pThreadLabel : TLabel );
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

// Counter aktualisieren
procedure TThreadCounter.Show
          ( );
begin
  Self.threadLabel.Caption := IntToStr( Self.count );
end;

// Thread verarbeiten
procedure TThreadCounter.Execute
          ( );
begin
  Self.count := 0;
  while True do
  begin
    Synchronize( Self.Show( ) );
    Inc( Self.count );
    if Self.terminated then
      Break;
  end;
end;

// Thread erstellen
procedure TForm1.createThreadCounter
          ( var pThreadCounter : TThreadCounter; var pStatCounter : Boolean; pThreadLabel : TLabel );
begin
  pStatCounter := not pStatCounter;
  if pStatCounter then
  begin
    pThreadCounter := TThreadCounter.Create( False );
    pThreadCounter.FreeOnTerminate := True;
    pThreadCounter.Priority := tpNormal;
    pThreadCounter.ThreadLabel := pThreadLabel;
  end
  else
    pThreadCounter.Terminate( );
end;

// Start des Counters durch Benutzer
procedure TForm1.Button1Click
          ( Sender : TObject );
begin
  Self.createThreadCounter( Self.counter1, Self.statCounter1, Self.label1 );
end;

procedure TForm1.Button2Click
          ( Sender : TObject );
begin
  Self.createThreadCounter( Self.counter2, Self.statCounter2, Self.label2 );
end;

end.
Aufgabe:

Ich habe zwei Buttons und zwei Label. Klicke ich auf Button1 wird der Counter in Label1 aktualisiert. Nochmaliges klicken stoppt den Counter und beim wiederholten Klick beginnt er von vorn. Klappt. Das selbe gilt für Button2.

Leider kann ich nur einen Counter starten und diesen muss ich stoppen, bevor ich den zweiten Counter aktiviere. Denn stoppe ich den ersten Counter nicht, friert beim Start des zweiten das Programm ein.

Wo liegt die Ursache? Kann ich keine zwei "identische" Instanzen einer TThread-Klasse gleichzeitig laufen lassen? (In meinen Augen völliger Quatsch) Für mich absolutes Neuland.

Danke für Eure Hilfe im Voraus.
  Mit Zitat antworten Zitat
christian_r
(Gast)

n/a Beiträge
 
#2

Re: Mehr als ein laufendes TThread-Objekt führt zum Einfrier

  Alt 17. Dez 2008, 05:02
Korrektur:

Aber das war auch nicht vorherzusehen. Wenn ich das compilierte Programm ausführe, dann läuft es wie geplant. Weiß jemand, warum mein Delphi 7 ES rummuckt? Wenn ich das Programm im Einzelschritt ablaufen lasse, dann sehe ich, dass es korrekt ausgeführt wird. Hat D7 evtl. Probleme mit der korrekten Echtzeitverarbeitung der Prozesse? Eigentlich sollten diese wie gehabt unabhängig vom Betriebssystem verwaltet werden.
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

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

Re: Mehr als ein laufendes TThread-Objekt führt zum Einfrier

  Alt 17. Dez 2008, 06:07
1. Bei Deiner Formatierung bekommt man Augenkrebs. Halte dich doch lieber an den Standard (also Nix ändern). So ist das eine Zumutung.
2. Beim Debuggen von Threads, die dann den Hauptthread via Synchronize aufrufen, kommt der Debugger durcheinander.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
christian_r
(Gast)

n/a Beiträge
 
#4

Re: Mehr als ein laufendes TThread-Objekt führt zum Einfrier

  Alt 17. Dez 2008, 06:31
Hast Du bitte eine Empfehlung zur Abhilfe? Ich will in Zukunft nicht jedesmal compilen und dann das Programm von Platte starten. Dann geht mir ja sonst ein großer Teil der Debugging-Funktionen verloren.

(An die Formatierung habe ich mich gewöhnt, daher ist sie für mich sicher genausogut lesbar wie für Dich die Std.Formatierung. Bei mir ist es umgedreht ebenso schwierig, auf Dauer die Std.Formatierung zu lesen. Aber ich werde bei den Posts versuchen an die Mehrheit im Forum zu denken.)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 05:26 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