Delphi-PRAXiS
Seite 2 von 3     12 3      

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)

MrBrown90 10. Nov 2017 13:43

AW: TCollection & TCollectionitem Tutorial
 
Ich soll mich in der Arbeit nirgends einloggen.

Ich denke, ich hab es geschafft..ich probiere noch weiter rum ..und schicke den ganzen Code dann von Zuhause.

Danke

TiGü 10. Nov 2017 14:46

AW: TCollection & TCollectionitem Tutorial
 
Zitat:

Zitat von MrBrown90 (Beitrag 1385908)
Ich soll mich in der Arbeit nirgends einloggen.

Damit meinten die sicher sowas wie Facebook, Instgram und dergleichen.
Es kann ja keiner was dagegen haben, wenn du dich für deine Arbeit hier Rat holst.

MrBrown90 10. Nov 2017 14:53

AW: TCollection & TCollectionitem Tutorial
 
Ne, hab natürlich nachgefragt..ist nicht erwünscht

haentschman 10. Nov 2017 18:22

AW: TCollection & TCollectionitem Tutorial
 
Moin...:P
[OT]
Zitat:

Ne, hab natürlich nachgefragt..ist nicht erwünscht
Da wäre für mich ein Kündigungsgrund. Die Online Medien, auf das Fach bezogen, nicht nutzen zu dürfen ist in meinen Augen Schwachsinn. :shock: Da gehe mal am Montag zum Chef und sage, daß du das komplette MSDN ausdeduckt haben möchtest weil es Online nicht erwünscht ist.

Ohne Worte...:roll:

PS: Mich würde mal interessieren, wieviele LKW auf dem Hof stehen müßten...:zwinker:
[/OT]

MrBrown90 13. Nov 2017 11:29

AW: TCollection & TCollectionitem Tutorial
 
Hi,

Für die Aufgabe die ich gepostet habe bezüglich Threads hab ich folgende Execute Methode geschrieben

Procedure TMyThread.Execute;
Begin
While Not Terminated so
If ID=1 Then
Begin
//Macht was
If ID=2 ....usw

Die Ids vergebe ich über eine listbox.

Aber ganz klappt das nicht, ist der Ansatz in Ordnung ?

TiGü 13. Nov 2017 11:39

AW: TCollection & TCollectionitem Tutorial
 
Zitat:

Zitat von MrBrown90 (Beitrag 1386104)
Hi,

Für die Aufgabe die ich gepostet habe bezüglich Threads hab ich folgende Execute Methode geschrieben

Procedure TMyThread.Execute;
Begin
While Not Terminated so
If ID=1 Then
Begin
//Macht was
If ID=2 ....usw

Die Ids vergebe ich über eine listbox.

Aber ganz klappt das nicht, ist der Ansatz in Ordnung ?

Das kommt jetzt darauf an, was genau "// Macht was" machen soll.
Und was genau "ganz klappt das nicht" heißen soll.
Klappt es nur zu 74,3 % oder wie sollen wir das deuten?
Das alte Glaskugel-Problem, du verstehst? :glaskugel:

Es gibt in Delphi auch sowas wie ein switch-case-Statement. Nennt sich hier Case-Of.
Kann ich dir folgende Lektüre ans Herz legen?
https://downloads.delphi-treff.de/DelphiStarter.pdf

TBx 13. Nov 2017 11:45

AW: TCollection & TCollectionitem Tutorial
 
Es wäre schön, wenn Du dir angewöhnen würde, die Delphi-Tags zu verwenden.
Dann sähe das Ganze so aus:
Delphi-Quellcode:
 
Procedure TMyThread.Execute;
Begin
  While Not Terminated do
    If ID=1 Then
    Begin
      //Macht was
    If ID=2 // ....usw
Prinzipiell ist ein
Delphi-Quellcode:
While not Terminated
im Execute eines TThread-Nachfahren richtig. Leider ist aus dem von Dir geposteten Bruchstücks nicht ersichtlich, ob die vollständige IF-Orgie (die man durch ein Case ersetzen könnte) im Deiner While-Schleife abgearbeitet wird. Auf den ersten Blick würde ich vermuten, das da nur das erste IF dranhängt, da auf das While-Statement kein begin folgt.

Und den von TiGü geposteten Link kann ich natürlich voll umfänglich empfehlen ;-)

MrBrown90 13. Nov 2017 11:53

AW: TCollection & TCollectionitem Tutorial
 
Okay

MACHT was = Form1.Memmo1.Lines.Add('Thread Nr 0' + DateTimetostr(Now) +'uhr')

Und das halt dann für jedem Thread, es ändert sich praktisch nur die Nummer des Threads

Meine einzelnen Threads starte ich über einen Button und davor wähle ich den Thread über die Listbox aus.

Procedure TForm1.StartClick(Sender: TObject)
Begin
If id =1 then
Begin
Thread1 := TMyThread.Create
End;

Usw...


Stoppen würde ich auch mit einem Button

If id =1 then
Begin
Thread1.free
End

Usw..

Es klappt nicht, das mehrer Threads gestartet werden ...es klappt nur bei Thread Nr 0


Und danke für die Lektüre, hab if nur zum testen benutzt, wollte mich noch mit Switch Case beschäftigen

TiGü 13. Nov 2017 12:02

AW: TCollection & TCollectionitem Tutorial
 
Ok...da haben wir jetzt mehrere Baustellen, aber arbeiten wir das erstmal Schritt für Schritt ab.

Was ist ID? Wo kommt die Variable her, wie wird sie befüllt?
Ändert sich der Wert von ID überhaupt, wenn du das dazu passende Oberflächenelement änderst?

Bitte höre auf am Handy zu schreiben und logge dich mit deinen PC ein. Das macht ja erstmal einen komischen Eindruck, wenn der Student in seinen Praktikum ständig am Smartphone hängt.
"Hey Chef, der neue Praktikant surft den ganzen Tag mitt'n Smartphone rum!" - "Waaaas??? Der soll doch seine einfache Lernaufgabe lösen!"

MrBrown90 13. Nov 2017 12:36

AW: TCollection & TCollectionitem Tutorial
 
Okay Id wird folgendermaßen bestimmt

Delphi-Quellcode:
Procedure TForm7.Listbox1Click(Sender:TObject)
Begin
ID=integer(ListBox1.Items.Objects[Listbox1.Itemindex]);
End;
Ps: bin allein im Büro, deswegen kann ich ja auch keine Kollegen um Hilfe Fragen

TiGü 13. Nov 2017 13:12

AW: TCollection & TCollectionitem Tutorial
 
Zitat:

Zitat von MrBrown90 (Beitrag 1386112)
Okay Id wird folgendermaßen bestimmt

Delphi-Quellcode:
Procedure TForm7.Listbox1Click(Sender:TObject)
Begin
ID=integer(ListBox1.Items.Objects[Listbox1.Itemindex]);
End;
Ps: bin allein im Büro, deswegen kann ich ja auch keine Kollegen um Hilfe Fragen

Delphi-Quellcode:
Procedure TForm7.Listbox1Click(Sender:TObject)
Begin
ID=integer(ListBox1.Items.Objects[Listbox1.Itemindex]);
ShowMessage('ID: ' + IntToStr(ID));
End;
Bitte einfach mal damit prüfen, ob ID wirklich geändert wird.

Wenn du eh alleine im Büro bist, dann nutze doch den Browser, guckt ja eh keiner.
Kannst ja auch ein Inkognito-Fenster/Private-Browsing-Tab nutzen. :roll:

Dann könntest du auch ganz einfach deinen bisherigen Quelltext posten und wir müssen nicht immer Glaskugel polieren und du wärst auch schneller am Ziel.

MrBrown90 13. Nov 2017 19:26

AW: TCollection & TCollectionitem Tutorial
 
So jetzt mal der Code wie ich ihn bisher habe

Delphi-Quellcode:
type
TForm1=class(TForm)
Start:TButton;
Button3:TButton;
ListBox1:TListBox;
Label1:TLabel1;
Label2:TLabel2;
ListBox3:TListBox;
Edit1:TEdit;
Memo1:TMemo;
procedure StartCklick(Sender:TObject);
procedure Button3Click(Sender:TObject);
procedure FormCreate(Sender:TObject);
procedure ListBox1Click(Sender:TObject);
private
public
end;
TyMyThread=Class(TThread)
protected
Counter:integer;
procedure execute;override;
public
constructor create;
end;

var
Form7:TForm7;
Thread1,Thread2,Thread3,Thread4,Thread5,Thread6:TMyThread;
ID,TreadID:integer;

implementation

procedure TMyThread.Execute;
var
   b:integer;
while not Terminated do
begin
   sleep(100)
   if b=1 then
begin
Form7.Memo1.Lines.Add('Thread Nr.0 ' +DataTimeToStr(Now) + 'Uhr');
end;
   if b=2 then
begin
Form7.Memo1.Lines.Add('Thread Nr.1 ' +DataTimeToStr(Now) + 'Uhr');
  end;
 end;
end;

procedure TForm7.StartClick(Sender :TOject);
var
  I:integer;
begin
  ThreadID:=ID;
  if ThreadID=1 then
  begin
Thread1:=TMyThread.create;
end;
   if ThreadID=2 then
   begin
   Thread2:=TMyThread.create;
 end;
end;


procedure TForm7.Button3Click(Sender:TObject);
begin
   if ID=1 then
   begin
     Thread1.Terminate;
     Thread1.WaitFor;
     Thread1.Free;
   end;
   if ID=2 then
   begin
     Thread2.Terminate;
     Thread2.WaitFor;
     Thread2.Free;
   end;
end;


constructor TMyThread.create;
begin
   inherited create(True);
   resume;
end;

procedure TForm7.FormCreate(Sender:TObject);
begin
    Listbox1.Items.AddObject('Thread Nr. 0', TObject(1));
    Listbox1.Items.AddObject('Thread Nr. 1', TObject(2));

end;


procedure 7TForm7.ListBox1Click(Sender: TObject);
begin
  ID:= integer(ListBox1.Items.Objects(ListBox1.ItemIndex));
end;


end.


Das wäre bis jetzt der ganze Code, muss natürlich noch ordentlich überarbeitet werden, aber ich denke soweit funktioniert es jetzt so, dass ich 2 Threads starten/stoppen kann und man dies in der Ausgabe sieht.

Sherlock 14. Nov 2017 08:13

AW: TCollection & TCollectionitem Tutorial
 
Ich steh grad aufm Schlauch, wo wird denn b gesetzt?

Sherlock

haentschman 14. Nov 2017 08:47

AW: TCollection & TCollectionitem Tutorial
 
Moin...:P
Komisch das sich noch niemand beschwert hat... :wink:
Delphi-Quellcode:
procedure TMyThread.Execute;
var
   b:integer;
while not Terminated do
begin
   sleep(100)
   if b=1 then
begin
Form7.Memo1.Lines.Add('Thread Nr.0 ' +DataTimeToStr(Now) + 'Uhr');
...
end;
:warn: Der Zugriff auf GUI Elemente aus dem Thread heraus, ist keine gute Idee!
Besser:
Ein Event aus dem Thread mit Synchronize.
http://docwiki.embarcadero.com/Libra...ad.Synchronize

MrBrown90 14. Nov 2017 08:49

AW: TCollection & TCollectionitem Tutorial
 
Oh hab ich wohl ausgelassen


In der execute, vor den if anweißungen ..b:=ID

TiGü 14. Nov 2017 08:58

AW: TCollection & TCollectionitem Tutorial
 
Du hast jetzt nicht ernsthaft alles händisch mit dem Smartphone abgetippt, oder etwas doch? :shock:
So kann das nämlich nicht kompilieren.

MrBrown90 14. Nov 2017 09:08

AW: TCollection & TCollectionitem Tutorial
 
Ne Ne, zuhause dann. Nur hab da keine Prog für Delphi, deswegen konnte ich nicht testen ...also kann sein das ich mich vll vertippt habe.

TiGü 14. Nov 2017 09:12

AW: TCollection & TCollectionitem Tutorial
 
E-Mail darfst du auf Arbeit auch nicht benutzen? Schick dir doch selber den Quelltext zu?!?

Eigentlich weiß ich nicht, wo man jetzt da anfangen soll.
Wenn wir dir jetzt das alles vorkauen und verbessern, dann hast du keinen Lerneffekt.

Versuche zuerst die Hinweise zum Case-Of und den Hinweis von haentschman bezüglich GUI-Zugriff aus einen externen Thread-Kontext heraus zu verstehen und umzusetzen.
Wenn es dir Schwierigkeiten bereitet es zu verstehen: Bitte frage gezielt nach!

TiGü 14. Nov 2017 09:16

AW: TCollection & TCollectionitem Tutorial
 
Und wegen Zuhause:
Bitte lade dir die KOSTENLOSE Delphi Starter Edition runter:
https://www.embarcadero.com/de/products/delphi/starter

Installieren nicht vergessen.

MrBrown90 14. Nov 2017 10:58

AW: TCollection & TCollectionitem Tutorial
 
Vielen Dank, mache ich.

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

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.

MrBrown90 15. Nov 2017 10:23

AW: TCollection & TCollectionitem Tutorial
 
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

4dk2 15. Nov 2017 11:20

AW: TCollection & TCollectionitem Tutorial
 
Zitat:

Zitat von MrBrown90 (Beitrag 1386327)
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.

MrBrown90 15. Nov 2017 19:11

AW: TCollection & TCollectionitem Tutorial
 
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?

TiGü 16. Nov 2017 09:57

AW: TCollection & TCollectionitem Tutorial
 
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
Delphi-Quellcode:
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.

MrBrown90 16. Nov 2017 10:33

AW: TCollection & TCollectionitem Tutorial
 
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

TiGü 16. Nov 2017 10:50

AW: TCollection & TCollectionitem Tutorial
 
Zitat:

Zitat von MrBrown90 (Beitrag 1386389)
Ja, es findet wohl gar keine Zuordnung statt. Die sollte dann wahrscheinlich im Instructor von TThreaditem stattfinden oder.

Constructor, das Wort heißt Constructor.
Aber wahrscheinlich schreibst du immer noch am Handy und das war die Autokorrektur.

Wenn es sich richtig anfühlt, dann wird es richtig sein! Mach es so!

Jetzt musst du noch einen erweiterten TMyThread-Constructor bauen, mit dessen Hilfe du die ID (0 bis 5) übergibst und diese ID innerhalb der TMyThread-Instanz speicherst.

MrBrown90 16. Nov 2017 11:36

AW: TCollection & TCollectionitem Tutorial
 
Ja ich meinte Constructor. Aber ich verstehe leider überhaubt nicht, wie ich das umsetzten soll.

So ist Quatsch oder ?

Delphi-Quellcode:
TThreadItem = class(TCollectionItem)

  private

  public

    FThreadItem:TMyThread;

    constructor Create(ACollection: TCollection); override;

  published

  end;

 

constructor TThreadItem.Create(ACollection: TCollection);

begin

    inherited Create(ACollection);

    FThreadItem:=TMyThread.Create;

 

end;

TiGü 16. Nov 2017 11:56

AW: TCollection & TCollectionitem Tutorial
 
Wäre eine Möglichkeit.
Ich würde prinzipiell die Instanz von TMyThread von außen erzeugen und über eine Property eingeben, aber das ist jetzt Geschmackssache und erstmal irrelevant.
Das TThreadItem ist dann in deiner Lösung verantwortlich für die Erzeugung der TMyThread-Instanzen und auch für deren Anhalten/Freigabe/Zerstörung.

Mache dir nun Gedanken, wie die jeweilige TMyThread-Instanz ihre ID erhält.
Vergleiche meinen Vorschlag mit dem erweiterten Constructor.

MrBrown90 16. Nov 2017 14:00

AW: TCollection & TCollectionitem Tutorial
 
Okay, also wenn ich das richtig verstehe, muss ich dann auch im deconstructor meine Threads terminieren und freigeben?


Mit den Ids hätte ich jetzt über die Listbox gelöst...oder ist das wieder schlecht, weil ich wieder direkt auf die GUI zugreife?

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

  begin

   ListBox1.Items.AddObject('Thread Nr. ' + IntToStr(i), TObject(ThreadL.AddEx));

  end;

DeddyH 16. Nov 2017 14:41

AW: TCollection & TCollectionitem Tutorial
 
Wenn der Hauptthread auf die GUI zugreift, ist das unproblematisch. Nur wenn Deine TThread-Instanzen das tun sollen, muss das (wie auch immer) synchronisiert geschehen, sei es per Messages, TThread.Synchronize oder TThread.Queue.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:47 Uhr.
Seite 2 von 3     12 3      

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