Autor Beitrag
Lenovo23456 Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Mi 22.11.17 11:13 
Okay vielen vielen Dank. Also wenn ich das richtig verstehe, macht man das so weil....

Ich habe FThreaditem in meiner Tcollectionitem Klasse als einen Typ von TMyThread deklariert. Dann im Constructor von TThreaditem habe ich geschrieben FThreaditem:=TMyThread.create. Damit erstelle ich meine einzelnen Threads und weise sie FThreaditem zu. Dann erstelle ich eine Instanz von TThreaditem (h) mit der ich dann wieder auf FThreaditem zugreife und mit FThreaditem wieder auf meine einzelnen Threads.

Also ich habe jetzt 6 TCollectionItems in meiner TCollection vom Typ TMyThread gespeichert?

Hab ich das so einigermaßen verstanden ?
TiGü
Hält's aus hier
Beiträge: 9
Erhaltene Danke: 1



BeitragVerfasst: Mi 22.11.17 12:18 
user profile iconLenovo23456 hat folgendes geschrieben Zum zitierten Posting springen:
Also ich habe jetzt 6 TCollectionItems in meiner TCollection vom Typ TMyThread gespeichert?

Hab ich das so einigermaßen verstanden ?


Ja.
Du hast 1 x TThreadlist mit 6 x TThreadItems mit je 1 x TMyThread.

Analoges Beispiel: Ein Einkaufswagen mit sechs Tüten in denen je ein Brot liegt.

Wieviele Brote hast du insgesamt?
Lenovo23456 Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Mi 22.11.17 17:10 
Oke, dann versteh ich es jetzt soweit. Vielen Dank .

Code wäre jetzt so

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
250:
251:
252:
253:
254:
255:
256:
257:
258:
259:
260:
261:
262:
263:
264:
265:
266:
267:
268:
269:
270:
271:
272:
273:
274:
275:
276:
277:
278:
279:
280:
281:
282:
283:
284:
285:
286:
287:
288:
289:
290:
291:
292:
293:
294:
295:
296:
297:
298:
299:
300:
301:
302:
303:
304:
305:
306:
307:
308:
309:
310:
311:
312:
313:
314:
315:
316:
317:
318:
319:
320:
321:
322:
323:
324:
325:
326:
327:
328:
329:
330:
331:
332:
333:
334:
335:
336:
337:
338:
339:
340:
341:
342:
343:
344:
345:
346:
347:
348:
349:
350:
351:
352:
353:
354:
355:
unit Unit7;

 

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;

    Memo1: TMemo;

    procedure StartClick(Sender: TObject);

    procedure FormCreate(Sender: TObject);

    procedure ListBox1Click(Sender: TObject);

    procedure Button3Click(Sender: TObject);

 

  private

    { Private-Deklarationen }

  public

    { Public-Deklarationen }

  end;

 

  TMyThread = class(TThread)

  protected

    procedure Execute; override;

  public

    constructor Create;

 

  end;

 

  TThreadItem = class(TCollectionItem)

  private

  public

 

    FThreadItem: TMyThread;

    constructor Create(ACollection: TCollection); override;

    procedure Start;

    procedure Stopp;

  published

  end;

 

  TThreadlist = class(TCollection)

  private

 

    procedure SetItems(Index: integer; AValue: TThreadItem);

  public

    constructor Create;

    function GetItems(Index: integer): TThreadItem;

    function AddEx: TThreadItem;

    property Items[Index: integer]: TThreadItem read GetItems

      write SetItems; default;

  end;

 

var

  Form7: TForm7;

  ID: integer;

  ThreadL: TThreadlist;

 

implementation

 

{$R *.dfm}

 

constructor TMyThread.Create;

begin

  inherited Create(True);

end;

 

constructor TThreadItem.Create(ACollection: TCollection);

begin

  inherited Create(ACollection);

  FThreadItem := TMyThread.Create;

 

end;

 

constructor TThreadlist.Create;

begin

  inherited Create(TThreadItem);

end;

 

procedure TThreadItem.Start;

begin

 

  FThreadItem.Resume;

 

end;

 

procedure TThreadItem.Stopp;

begin

  FThreadItem.Suspend;

end;

 

function TThreadlist.GetItems(Index: integer): TThreadItem;

begin

  result := TThreadItem(inherited Items[index]);

end;

 

procedure TThreadlist.SetItems(Index: integer; AValue: TThreadItem);

var

  T: TMyThread;

begin

  Items[Index].Assign(AValue);

end;

 

function TThreadlist.AddEx: TThreadItem;

begin

  result := inherited Add as TThreadItem;

end;

 

procedure TMyThread.Execute;

var

  ProgID: integer;

begin

  ProgID := ID;

  while not Terminated do

  begin

    sleep(100);

 

    Form7.Memo1.Lines.Add('Thread Nr. ' + IntToStr(ProgID) + ' ' +

      DateTimeToStr(Now) + ' Uhr');

 

  end;

end;

 

procedure TForm7.ListBox1Click(Sender: TObject);

begin

  ID := integer(ListBox1.Items.Objects[ListBox1.ItemIndex])

end;

 

procedure TForm7.FormCreate(Sender: TObject);

var

  i: integer;

begin

  ThreadL := TThreadlist.Create;

  for i := 0 to 5 do

  begin

    ThreadL.AddEx;

  end;

  for i := 0 to 5 do

  begin

    if Assigned(ThreadL) then

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

 

  end;

  ShowMessage(IntToStr(ThreadL.count));

end;

 

procedure TForm7.StartClick(Sender: TObject);

var

  Thread: TMyThread;

  StartItem: TThreadItem;

  StartID: integer;

begin

  StartID := ID;

 

  StartItem := ThreadL.GetItems(StartID);

  StartItem.Start;

 

end;

 

procedure TForm7.Button3Click(Sender: TObject);

var

  StartID: integer;

  StartItem: TThreadItem;

  Thread: TMyThread;

begin

  StartID := ID;

 

  StartItem := ThreadL.GetItems(StartID);

  StartItem.Stopp;

 

end;

 

end.


Dann beschäftige ich mich jetzt mal mit Synchronize und Messages
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 22.11.17 20:30 
- Nachträglich durch die Entwickler-Ecke gelöscht -
haentschman
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 285
Erhaltene Danke: 33


DX10 Berlin Professional
BeitragVerfasst: Do 23.11.17 08:15 
Moin... 8)
Zitat:
...aber Hinweise wie die Logik von der GUI zu trennen, sind nicht gefallen. Oder warum wird noch immer in der Execute() Methode die Form7 und sonstiges aufgerufen.

Doch...siehe meinen Beitrag. Nur wurden die Hinweise nicht umgesetzt. :roll:
Zitat:

Der Zugriff auf GUI Elemente aus dem Thread heraus, ist keine gute Idee!
Besser:
Ein Event aus dem Thread mit Synchronize.

www.delphipraxis.net/1386197-post54.html
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 23.11.17 10:13 
user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
Oder warum wird noch immer in der Execute() Methode die Form7 und sonstiges aufgerufen.
Siehe oben:
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Wenn du Glück hast, gibt es auch erst einmal keine Fehler. Denn dass die Synchronisierung fehlt, wurde ja schon gesagt. Du darfst aus einem Thread nie direkt auf deine GUI zugreifen.
TiGü
Hält's aus hier
Beiträge: 9
Erhaltene Danke: 1



BeitragVerfasst: Do 23.11.17 10:44 
user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
Wenn man es nicht schafft, einem weniger erfahrenen Teilnehmer in wenigen Beiträgen zu erklären wie es geht, dann erklärt man es nicht richtig.

Der weniger erfahrene Teilnehmer ist Informatikstudent im fortgeschrittenen Semester und bearbeitet als Werkstudent seit ANFANG November diese Aufgabe.
So ein bisschen Eigeninitiative und Grundverständnis muss man da voraussetzen.
Er ist kein 14 jähriger Schüler.

user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:

Hier geht es wieder weiter um unwesentliche Dinge wie Milch und Brot, aber Hinweise wie die Logik von der GUI zu trennen, sind nicht gefallen.
Oder warum wird noch immer in der Execute() Methode die Form7 und sonstiges aufgerufen.

Es ging nur um Brot als analoges Beispiel, nicht um Milch.
Hinweise die Logik von der GUI zu trennen sind zuhauf und mehrfach und mit Doku-Hinweisen in der DP nachzulesen.
Leider wurden fast alle Vorschläge und Hinweise nicht umgesetzt. Siehe dein Hinweis mit den Start- und Stop-Methoden am Item.
Der war eigentlich klar und eindeutig. Stattdessen wurde an die Thread-Klasse eine Start-Methode rangebastelt.
Der TE kann aber halt auch nicht konkret seine Fragen formulieren. Man muss ihm auch immer die Fehlermeldungen aus der Nase ziehen.
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Do 23.11.17 10:52 
Es wäre schön, wenn Ihr die Off-Topic-Diskussion dann hier beenden könntet ;-)

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".

Für diesen Beitrag haben gedankt: Narses