Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Mehrere Threads gleichzeitig starten
Kugelblitz - Mi 27.12.06 18:29
Titel: Mehrere Threads gleichzeitig starten
Hallo
Ich such mich schon seit Tagen danach Tot wie ich eigentlich dynamisch so viele Threads wie ich will starten kann...
Zwar steht überall dass ich dann synchronisieren muss usw, nur soweit komm ich erstmal gar nicht ^^
Ich möchte dass der Benutzer selbst bestimmen kann wie viele Threads verwendet werden sollen.
Wahrscheinlich hab ich nur ein Brett vor dem Kopf, wäre trotzdem nett wenn mir jemand helfen könnte ;)
So starte ich meinen (einen) Thread im Moment.
Delphi-Quelltext
1: 2: 3: 4: 5:
| thread := MyThread.Create(true); thread.SetId(1); thread.SetURL('http://google.de'); thread.FreeOnTerminate := true; thread.Resume; |
mfg
Kugelblitz
C.Schoch - Mi 27.12.06 19:48
Beispiel so
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| var Threads : array of MyThread; i : integer; begin setlength(Threads, Uservar) for i := 0 to high(threads) do begin threads[i] := MyThread.Create(true); threads[i].SetId(i); threads[i].SetURL('http://google.de'); threads[i].FreeOnTerminate := true; threads[i].Resume; end; end; |
frei getippt.
Kugelblitz - Mi 27.12.06 22:57
danke erstmal ;)
scheint auch zu funktionieren allerdings hab ich jetzt ein anderes Problem...
und zwar arbeitet nur der letzte thread wirklich etwas ab (bzw nur da kommt was im Hauptprogramm an)...
wenn ich den ersten thread aber arbeiten lasse und das starten des zweiten verzögere bis der erste fertig ist und dann den zweiten starte dann funktionierts, aber das ist ja nicht das was ich will :P
so sieht es "in" meinem Thread aus:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure MyThread.Execute; var i : integer; begin http := TIdHTTP.Create(nil); http.HandleRedirects := true; for i := 0 to 5 do str := http.Get(url); Synchronize(UpdateMemo);
end; |
C.Schoch - Mi 27.12.06 23:51
Eigentlich kann nicht am Thread Code liegen.
Ich bin mir aber nicht sicher was Synchronize macht wenn die GUI blokiert ist. Normalerweise wartet es.
Zeig mal den UpdateMemo code
Kugelblitz - Mi 27.12.06 23:58
eigentlich nix besonderes, nur:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| procedure MyThread.UpdateMemo; begin if (id = 1) then Form1.Memo1.Text := str else Form1.Memo2.Text := str; end; |
Narses - Mi 27.12.06 23:59
Moin!
Kugelblitz hat folgendes geschrieben: |
so sieht es "in" meinem Thread aus:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| procedure MyThread.Execute; var i : integer; begin http := TIdHTTP.Create(nil); http.HandleRedirects := true; for i := 0 to 5 do str := http.Get(url); Synchronize(UpdateMemo); end; | |
Wo ist denn str deklariert? Ich hoffe doch, als lokale Variable des Threads... ? ;)
cu
Narses
Kugelblitz - Do 28.12.06 00:07
Delphi-Quelltext
1: 2: 3:
| private str : string; |
Narses - Do 28.12.06 00:12
Moin!
Zeig doch mal den kompletten Code deiner Thread-Klasse; mit dem Stückwerk kommen wir wohl nicht weiter. :?
cu
Narses
Kugelblitz - Do 28.12.06 00:22
Sorry mein Fehler, hätte ich wahrscheinlich besser direkt gemacht ;)
Dein Beitrag hat mir aber den entscheidenden Hinweis grade gegeben, und zwar war die ID nicht als lokale Variable deklariert und darum wurde wohl alles durcheinander geschmissen...
trotzdem hier gerne der Code für jeden der vielleicht mal das gleiche Problem hat wie ich ;)
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:
| unit Unit2;
interface
uses Classes, IdHTTP;
type MyThread = class(TThread) private http: TIdHTTP; str,url : string; id : integer; protected procedure Execute; override; public procedure UpdateMemo; virtual; procedure SetId (pID : integer); virtual; procedure SetURL (pURL : string); virtual; end;
implementation
uses unit1;
procedure MyThread.SetId(pID : integer); begin id := pID; end;
procedure MyThread.SetURL(pURL : string); begin url := pURL; end;
procedure MyThread.UpdateMemo; begin if (id = 1) then Form1.Memo1.Text := str else Form1.Memo2.Text := str; end;
procedure MyThread.Execute; var i : integer; begin http := TIdHTTP.Create(nil); http.HandleRedirects := true; for i := 0 to 5 do str := http.Get(url); Synchronize(UpdateMemo); end;
end. |
Danke für eure Hilfe ...
Narses - Do 28.12.06 00:29
Moin!
Wenn dein Problem gelöst ist, markierst du den Thread dann noch entsprechend? Danke. ;)
cu
Narses
Kugelblitz - Do 28.12.06 00:31
Oh sicher...
den angenehmsten Part lass ich mir doch nicht nehmen ;)
mfg
Kugelblitz
Lossy eX - Do 28.12.06 11:13
Synchronize setzt eine Windows Message ab die dafür sorgt, dass die Methode aus dem VCL Thread heraus aufgerufen wird. Und durch die Messages wird dafür gesorgt, dass sie schön nacheinander aufgerufen werden. Sofern dort nich irgendwer händisch ein Application.ProcessMessages aufruft.
So auf die Schnelle kann ich in deinem Code keinen Fehler finden. Gibt ja auch nicht viel was man da falsch machen kann.
Was veranlasst dich eigentlich zu der Annahme, dass es nicht funktioniert? Du schreibst schließlich alles in ein/zwei Memos. Es könnte natürlich sein, dass Bruchteile vor dem letzten Thread die anderen etwas in das Memo schreiben was sofort wieder überschrieben wird. Das ist in meinen Augen nämlich das wahrscheinlichste.
Mach mal folgendes
Delphi-Quelltext
1: 2: 3: 4:
| procedure MyThread.UpdateMemo; begin Form1.Memo1.Lines.Add('Finisched: ' + url); end; |
PS: Ein Array mit Threads zu füllen die sich automatisch freigeben ist mutig oder sinnlos. Oder beides. Wenn diese fertig sind bleibt der Wert dort noch enthalten aber die Klasse wurde in der zwischenzeit freigegeben. Wenn du diese einfach nur starten willst kannst du entweder immer wieder die Variable
Thread überschreiben oder etwas in der Art.
Delphi-Quelltext
1: 2: 3: 4: 5:
| with TMyThread do begin Blahhh(); FreeOnTerminate := True; Resume; end; |
So kommst du gar nicht erst in die Verlegenheit eine Instanz davon zu Speichern. Ich Persönlich hebe mir aber gerne die Instanzen auf. Dann sollten sie sich aber nicht selber frei geben.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!