Delphi-PRAXiS
Seite 7 von 9   « Erste     567 89      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   TCollection & TCollectionitem Tutorial (https://www.delphipraxis.net/194306-tcollection-tcollectionitem-tutorial.html)

TiGü 14. Nov 2017 11:14

AW: TCollection & TCollectionitem Tutorial
 
Zitat:

Zitat von MrBrown90 (Beitrag 1386216)
Aber eine Frage hätte ich noch. Wie sehe ich denn, das dies alles von mehreren Threads ausgeführt wird ?

Kannst du diese Frage umformulieren und etwas ausführlicher gestalten?
Wenn du beide Threads startest, sollten beide ins Memo schreiben?! War das die Antwort auf deine Frage?

MrBrown90 14. Nov 2017 11:37

AW: TCollection & TCollectionitem Tutorial
 
Ja genau das war die Frage. Aber wenn ich z.b die if b=2 weglasse, wird auch 2mal ins Memo geschrieben. Dann wird alles von einem Thread ausgeführt?

Sherlock 14. Nov 2017 11:42

AW: TCollection & TCollectionitem Tutorial
 
Im Moment ist der Code noch nicht sinnvoll. Melde Dich sobald er compiliert. Mit dem richtigen Code!

Sherlock

TiGü 14. Nov 2017 12:07

AW: TCollection & TCollectionitem Tutorial
 
Leider ignorierst du viele Fragen, aber vielleicht gehst du auf die folgenden Fragen ein:

Weist du was der Debugger und ein Haltepunkt/Breakpoint ist?
Wenn ja, weißt du wie du ihn in Delphi benutzt?

MrBrown90 14. Nov 2017 20:21

AW: TCollection & TCollectionitem Tutorial
 
Delphi-Quellcode:
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Menus, Vcl.ExtCtrls;
 
type
  TForm7 = class(TForm)
    Start: TButton;
    Button3: TButton;
    ListBox1: TListBox;
    Label1: TLabel;
    Label2: TLabel;
    ListBox3: TListBox;
    Edit1: TEdit;
    Memo1: TMemo;
    Timer1: TTimer;
    procedure StartClick(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure ListBox1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;
 
  TMyThread = class(TThread)
  protected
    counter: integer;
    procedure Execute; override;
    procedure prog;
  public
    constructor create;
  end;
 
var
  Form7: TForm7;
  Thread1, Thread2, Thread3, Thread4, Thread5, Thread6: TMyThread;
  ID, ThreadID: integer;
 
implementation
 
{$R *.dfm}
 
procedure TMyThread.Execute;
var
  ProgID: integer;
begin
  ProgID := ID;
  while not Terminated do
  begin
    sleep(100);
    case ProgID of
      0:
        begin
          Form7.Memo1.Lines.Add('Thread Nr. 0 ' + DateTimeToStr(Now) + ' Uhr');
        end;
      1:
        begin
          Form7.Memo1.Lines.Add('Thread Nr. 1 ' + DateTimeToStr(Now) + ' Uhr');
        end;
      2:
        begin
          Form7.Memo1.Lines.Add('Thread Nr. 2 ' + DateTimeToStr(Now) + ' Uhr');
        end;
      3:
        begin
          Form7.Memo1.Lines.Add('Thread Nr. 3 ' + DateTimeToStr(Now) + ' Uhr');
        end;
      4:
        begin
          Form7.Memo1.Lines.Add('Thread Nr. 4 ' + DateTimeToStr(Now) + ' Uhr');
        end;
      5:
        begin
          Form7.Memo1.Lines.Add('Thread Nr. 5 ' + DateTimeToStr(Now) + ' Uhr');
        end;
    end;
  end;
end;
 
procedure TForm7.StartClick(Sender: TObject);
var
  i: integer;
begin
  ThreadID := ID;
  case ThreadID of
    0:
      begin
        Thread1 := TMyThread.create;
      end;
    1:
      begin
        Thread2 := TMyThread.create;;
      end;
    2:
      begin
        Thread3 := TMyThread.create;
      end;
    3:
      begin
        Thread4 := TMyThread.create;
      end;
    4:
      begin
        Thread5 := TMyThread.create;
      end;
    5:
      begin
        Thread6 := TMyThread.create;
      end;
  end;
end;
 
procedure TForm7.Timer1Timer(Sender: TObject);
begin
  Timer1.interval := 6000;
end;
 
procedure TMyThread.prog;
begin
 
end;
 
procedure TForm7.Button3Click(Sender: TObject);
begin
  case ID of
    0:
      begin
        Thread1.Terminate;
        Thread1.WaitFor;
        Thread1.Free;
      end;
    1:
      begin
        Thread2.Terminate;
        Thread2.WaitFor;
        Thread2.Free;
      end;
    2:
      begin
        Thread3.Terminate;
        Thread3.WaitFor;
        Thread3.Free;
      end;
    3:
      begin
        Thread4.Terminate;
        Thread4.WaitFor;
        Thread4.Free;
      end;
    4:
      begin
        Thread5.Terminate;
        Thread5.WaitFor;
        Thread5.Free;
      end;
    5:
      begin
        Thread6.Terminate;
        Thread6.WaitFor;
        Thread6.Free;
     end;
  end;
 
end;
 
constructor TMyThread.create;
begin
  inherited create(True);
  resume;
end;
 
procedure TForm7.FormCreate(Sender: TObject);
begin
  ListBox1.Items.AddObject('Thread Nr. 0', TObject(0));
  ListBox1.Items.AddObject('Thread Nr. 1', TObject(1));
  ListBox1.Items.AddObject('Thread Nr. 2', TObject(2));
  ListBox1.Items.AddObject('Thread Nr. 3', TObject(3));
  ListBox1.Items.AddObject('Thread Nr. 4', TObject(4));
  ListBox1.Items.AddObject('Thread Nr. 5', TObject(5));
 
end;
 
procedure TForm7.ListBox1Click(Sender: TObject);
begin
 
  ID := integer(ListBox1.Items.Objects[ListBox1.ItemIndex]);
end;
 
end.
Das wäre jetzt der ganze Code, dieser lässt sich auch compilieren.
Danke nochmal für die ganze Hilfe.

Mein Chef hätte jetzt noch gerne das ich da mit Messages arbeite.
ich hab mich schon kurz eingelesen, geht dann um Postmessage oder?

haentschman 15. Nov 2017 08:48

AW: TCollection & TCollectionitem Tutorial
 
Liste der Anhänge anzeigen (Anzahl: 1)
Moin...:P
Zitat:

Das wäre jetzt der ganze Code, dieser lässt sich auch compilieren.
... das wars dann auch schon. :?
Zitat:

Im Moment ist der Code noch nicht sinnvoll.
...meine ich auch. :? Der ganze Workflow ist nicht schlüssig. Ein Programmablaufplan ist dir geläufig? (siehe Beispielbild) Damit solltest du anfangen.
Beispiel:
Was soll passiern wenn der Button3 mehrfach gedrückt wird? ...usw.
Zitat:

Ich hab in meiner Arbeit vor paar Tagen angefangen Delphi zu lernen.
Threads und deren Fallstricke, sind imho nicht der geeignete Anfang.

Zitat:

Mein Chef hätte jetzt noch gerne das ich da mit Messages arbeite.
Ist im Prinzip eine Art von Syncronisierung. Ob ein Event mit Syncronize oder PostMessage ist nur in der Ausführung unterschiedlich. (synchron, asynchron)

Zitat:

Danke nochmal für die ganze Hilfe.
...du bist noch lange nicht fertig. :wink:

grobe Fehler:
1: :warn:
Delphi-Quellcode:
Form7.Memo1.Lines.Add('Thread Nr. 0 ' + DateTimeToStr(Now) + ' Uhr');
Wie ich schon gesagt habe, ein Zugriff auf die GUI ist keine gute Idee!
http://www.delphipraxis.net/1386197-post54.html
2: :warn:
Delphi-Quellcode:
var
  Form7: TForm7;
  Thread1, Thread2, Thread3, Thread4, Thread5, Thread6: TMyThread;
  ID, ThreadID: integer;
Globale Variablen in Verbindung mit Threads sind keine gute Idee!
https://forum.delphi-treff.de/index....len-Variablen/
3: :warn:
Delphi-Quellcode:
procedure TForm7.Button3Click(Sender: TObject);
begin
  case ID of
    0:
      begin
        Thread1.Terminate;
        Thread1.WaitFor;
        Thread1.Free;
      end;
Beim Beenden des Threads über den Button wird er "abgeräumt"...nicht aber beim Beenden der Anwendung!
Einfügen: In die DPR
Delphi-Quellcode:
ReportMemoryLeaksOnShutdown := True;
und wundern. :zwinker:
4: :warn:
Delphi-Quellcode:
procedure TForm7.Timer1Timer(Sender: TObject);
begin
  Timer1.interval := 6000;
end;
Was denkst du was da passiert?

Tipps (kein Muß):
1: Bitte Codeformatter benutzen. Wie in anderen Programmiersprachen auch...sprechende Namen verwenden. 8-)
2: Stelle dir mal vor das du 100 Threads hast? Wie sieht die USES aus? Schei...:roll: Wie sehen die Proceduren aus? Schei...:roll: Für so etwas gibt es Listen mit den Instanzen als Inhalt. Thread erstellen, ab in die Liste. Von dort holt man sich die Instanz in eine Variable. (z.B. CurrentThread)

4dk2 15. Nov 2017 08:53

AW: TCollection & TCollectionitem Tutorial
 
was hat das ganze mit "TCollection & TCollectionitem Tutorial" zu tun ?

MrBrown90 15. Nov 2017 09:14

AW: TCollection & TCollectionitem Tutorial
 
Ich weiß das ich noch lange nicht fertig bin, aber ein "Danke" zwischendurch muss mal sein ..ist ja nicht selbstverständlich 😀


Ich werde mich dann gleich mal an deinen Punkten versuchen. Nur bei Punkt 1, irgendwie muss ich ja auf die GUI zugreifen oder ? Und als Liste wäre dann wahrscheinlich eine TCollection geeignet oder?

TiGü 15. Nov 2017 09:40

AW: TCollection & TCollectionitem Tutorial
 
Die ganzen schwerwiegenden Threading-Probleme will ich gar erst nicht ansprechen, da musst du das schon geschriebene umsetzen.
Von den globalen Variablen ganz zu schweigen.

Es ist aber für einen Informatik-Studenten in deinem Alter und nach einer handvoll Semester schon ein bisschen traurig, dass er nicht von alleine auf die Verwendung von Schleifen sowie Arrays bzw. Listen kommt.
Das hat auch nichts mit Delphi an sich zu tun, das sollte eigentlich sitzen.
Vom Niveau her ist die Aufgabe auch geeignet für den IT-Unterricht im Abitur.

Beispiel:

Delphi-Quellcode:
procedure TForm7.FormCreate(Sender: TObject);
var
  I: Integer;
begin
  for I := 0 to 5 do
  begin
     ListBox1.Items.AddObject('Thread Nr. ' + IntToStr(I), TObject(I));
  end;
end;
Ich will dich jetzt zwar nicht entmutigen, aber bist du sicher, das Informatik und Programmieren der richtige Weg für dich ist?

TiGü 15. Nov 2017 09:44

AW: TCollection & TCollectionitem Tutorial
 
Zitat:

Zitat von MrBrown90 (Beitrag 1386312)
Nur bei Punkt 1, irgendwie muss ich ja auf die GUI zugreifen oder??

Ja, du musst auf die GUI zugreifen, aber nicht so.
Das ist verboten! Dafür kommst du in die Programmierhölle.
Das ist so, als würdest du mit Mutter und Schwester schlafen.
Das geht zwar technisch, wird aber von deiner Umgebung aus guten Gründen abgelehnt!

haentschman hat schon mehrfach auf die Dokumentation hingewiesen, du MUSST aber auch auf die Links draufklicken, lesen und verstehen:

http://docwiki.embarcadero.com/Libra...ad.Synchronize

Da ist unten sogar ein fünfzeiliger Beispielcode.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:27 Uhr.
Seite 7 von 9   « Erste     567 89      

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