Autor Beitrag
Kugelblitz
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 34

Win XP, Debian

BeitragVerfasst: Mi 27.12.06 18:29 
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.
ausblenden 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

_________________
I haven't lost my mind; it's backed up on tape somewhere!
C.Schoch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 28

WinXp
Turbo Dephi Win 32
BeitragVerfasst: Mi 27.12.06 19:48 
Beispiel so
ausblenden 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.

_________________
Das System hofft auf Besserung
[Siemens]
Kugelblitz Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 34

Win XP, Debian

BeitragVerfasst: 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:

ausblenden 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 //nur zum verzögern und testen...
   str := http.Get(url);
  Synchronize(UpdateMemo);

end;

_________________
I haven't lost my mind; it's backed up on tape somewhere!
C.Schoch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 28

WinXp
Turbo Dephi Win 32
BeitragVerfasst: 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

_________________
Das System hofft auf Besserung
[Siemens]
Kugelblitz Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 34

Win XP, Debian

BeitragVerfasst: Mi 27.12.06 23:58 
eigentlich nix besonderes, nur:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure MyThread.UpdateMemo;
begin
if (id = 1then
  Form1.Memo1.Text := str
else
  Form1.Memo2.Text := str;
end;

_________________
I haven't lost my mind; it's backed up on tape somewhere!


Zuletzt bearbeitet von Kugelblitz am Do 28.12.06 00:04, insgesamt 2-mal bearbeitet
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mi 27.12.06 23:59 
Moin!

user profile iconKugelblitz hat folgendes geschrieben:
so sieht es "in" meinem Thread aus:
ausblenden 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 //nur zum verzögern und testen...
   str := http.Get(url);
  Synchronize(UpdateMemo);
end;

Wo ist denn str deklariert? Ich hoffe doch, als lokale Variable des Threads... ? ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Kugelblitz Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 34

Win XP, Debian

BeitragVerfasst: Do 28.12.06 00:07 
ausblenden Delphi-Quelltext
1:
2:
3:
  private
    { Private declarations }
      str : string;

_________________
I haven't lost my mind; it's backed up on tape somewhere!
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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

_________________
There are 10 types of people - those who understand binary and those who don´t.
Kugelblitz Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 34

Win XP, Debian

BeitragVerfasst: 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 ;)

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:
unit Unit2;

interface

uses
  Classes, IdHTTP;

type
  MyThread = class(TThread)
  private
    { Private declarations }
      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 = 1then
  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 ...

_________________
I haven't lost my mind; it's backed up on tape somewhere!
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Do 28.12.06 00:29 
Moin!

Wenn dein Problem gelöst ist, markierst du den Thread dann noch entsprechend? Danke. ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Kugelblitz Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 34

Win XP, Debian

BeitragVerfasst: Do 28.12.06 00:31 
Oh sicher...

den angenehmsten Part lass ich mir doch nicht nehmen ;)

mfg
Kugelblitz

_________________
I haven't lost my mind; it's backed up on tape somewhere!
Lossy eX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: 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
ausblenden 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.
ausblenden 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.

_________________
Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.