AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

TCollection & TCollectionitem Tutorial

Ein Thema von MrBrown90 · begonnen am 7. Nov 2017 · letzter Beitrag vom 16. Nov 2017
Antwort Antwort
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.437 Beiträge
 
Delphi 12 Athens
 
#1

AW: TCollection & TCollectionitem Tutorial

  Alt 15. Nov 2017, 07:48
Moin...
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.

grobe Fehler:
1:
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:
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:
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 ReportMemoryLeaksOnShutdown := True; und wundern.
4:
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.
2: Stelle dir mal vor das du 100 Threads hast? Wie sieht die USES aus? Schei... Wie sehen die Proceduren aus? Schei... 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)
Angehängte Grafiken
Dateityp: png programmablaufplan.png (49,9 KB, 15x aufgerufen)
  Mit Zitat antworten Zitat
4dk2

Registriert seit: 4. Sep 2007
176 Beiträge
 
#2

AW: TCollection & TCollectionitem Tutorial

  Alt 15. Nov 2017, 07:53
was hat das ganze mit "TCollection & TCollectionitem Tutorial" zu tun ?
  Mit Zitat antworten Zitat
MrBrown90

Registriert seit: 7. Nov 2017
39 Beiträge
 
#3

AW: TCollection & TCollectionitem Tutorial

  Alt 15. Nov 2017, 08:14
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?
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.074 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: TCollection & TCollectionitem Tutorial

  Alt 15. Nov 2017, 08:44
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.
  Mit Zitat antworten Zitat
MrBrown90

Registriert seit: 7. Nov 2017
39 Beiträge
 
#5

AW: TCollection & TCollectionitem Tutorial

  Alt 15. Nov 2017, 09:23
Natürlich weiß ich wie Schleifen, Arrays usw funktionieren ...ich hab nur mein Augenmerk auf Threads gelegt, weil ich da absolut keine Ahnung davon hatte.

Und nein, ich bin mir nicht sicher ob es der richtige Weg ist. Aber was spielt das hier für eine Rolle? Fertig machen werde 8ch das Studium
  Mit Zitat antworten Zitat
4dk2

Registriert seit: 4. Sep 2007
176 Beiträge
 
#6

AW: TCollection & TCollectionitem Tutorial

  Alt 15. Nov 2017, 10:20
Natürlich weiß ich wie Schleifen, Arrays usw funktionieren ...ich hab nur mein Augenmerk auf Threads gelegt, weil ich da absolut keine Ahnung davon hatte.

Und nein, ich bin mir nicht sicher ob es der richtige Weg ist. Aber was spielt das hier für eine Rolle? Fertig machen werde 8ch das Studium
DAS GANZE GEHÖRT hier aber nicht hin.
Mach bitte einen eigenen Thread dazu auf.
  Mit Zitat antworten Zitat
MrBrown90

Registriert seit: 7. Nov 2017
39 Beiträge
 
#7

AW: TCollection & TCollectionitem Tutorial

  Alt 15. Nov 2017, 18:11
Okay, Sorry ist wohl etwas vom ursprünglichen Thema abgewichen, dann wieder zurück zu TCollection.

Ich habe jetzt versucht, dass beim Programmstart 6 Threads erstellt werden und in einer TCollection gespeichert werden. Hier mal der Code dazu

Delphi-Quellcode:

TMyThread = class(TThread)
  protected
    counter: integer;
    procedure Execute; override;
    procedure prog;
  public
    constructor Create;
  end;



TThreadItem = class(TCollectionItem)
  private
    FLength: integer;
  public
    constructor Create(ACollection: TCollection); override;
  published
    property Length: integer read FLength write FLength;
  end;
 
  TThreadlist = class(TCollection)
  private
 
    procedure SetItems(Index: integer; AValue: TThreadItem);
  public
    constructor Create;
    function GetItems(Index: integer): TThreadItem;
    function AddEx(ite: TMyThread): TThreadItem;
    property Items[Index: integer]: TThreadItem read GetItems
      write SetItems; default;
  end;

implementation




constructor TThreadItem.Create(ACollection: TCollection);
begin
  if Assigned(ACollection) then
    inherited Create(ACollection);
end;
 


constructor TThreadlist.Create;
begin
  inherited Create(TThreadItem);
end;


constructor TMyThread.Create;
begin
  inherited Create(True);
end;


function TThreadlist.GetItems(Index: integer): TThreadItem;
begin
  result := TThreadItem(inherited Items[index]);
end;

function TThreadlist.AddEx(ite: TMyThread): TThreadItem;
begin
  result := inherited Add as TThreadItem;
end;


function TThreadlist.AddEx(ite: TMyThread): TThreadItem;
begin
  result := inherited Add as TThreadItem;
end;

procedure TForm7.FormCreate(Sender: TObject);
var
  i: integer;
  Thread:array [0..5] of TMyThread;
  p: TThreadItem;
begin
  ThreadL := TThreadlist.Create;
  for i := 0 to 5 do
  begin
    ListBox1.Items.AddObject('Thread Nr. ' + IntToStr(i), TObject(i));
  end;
  for i := 0 to 5 do
  begin
    Thread[i]:=TMyThread.Create;
    ThreadL.AddEx(Thread[i]);
  end;
ShowMessage(IntToStr(ThreadL.Count));
end;
Ist das soweit richtig?
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.074 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: TCollection & TCollectionitem Tutorial

  Alt 16. Nov 2017, 08:57
Ich bin kurz davor, einfach den Quelltext in gut und fertig zu posten, aber ich habe die Hoffnung noch nicht aufgeben.

Bitte folgende Fragen beantworten:
Wo genau findet bei dir die Zuordnung TThreadItem zu TMyThread statt?
oder
Woher weiß das TThreadItem, dass ihm ein TMyThread zugeordnet ist?

Was macht FLength in TThreadItem, wozu dient es?
Wozu dient das Array Thread:array [0..5] of TMyThread; ?

Was soll am Ende mit deiner Collection geschehen? Was ist das Ziel?


PS: TThreadlist.AddEx ist zweimal reinkopiert und TThreadlist.SetItems fehlt.
  Mit Zitat antworten Zitat
MrBrown90

Registriert seit: 7. Nov 2017
39 Beiträge
 
#9

AW: TCollection & TCollectionitem Tutorial

  Alt 16. Nov 2017, 09:33
Danke für die Geduld.

Ja, es findet wohl gar keine Zuordnung statt. Die sollte dann wahrscheinlich im Instructor von TThreaditem stattfinden oder.

Flength hab ich entfernt, war Quatsch.

Und das Array ergibt eigentlich aauch kein Sinn.

Ich möchte das beim Programmstart 6 Instanzen von TMyThread erstellt werden und in meiner TCollection eingefügt werden

Wahrscheinlich so der richtige Ansatz ?

Delphi-Quellcode:
for i := 0 to 5 do

  begin

    ThreadL.AddEx(Thread.Create);

  end;
Dann soll es so funktionieren
Start-Button drücken
THREAD mit bestimmter ID startet sie
Und dieses Threads will ich mir aus meiner TCollection holen
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.074 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: TCollection & TCollectionitem Tutorial

  Alt 15. Nov 2017, 08:40
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?
  Mit Zitat antworten Zitat
Antwort Antwort

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 17:39 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