| Autor | Beitrag | 
| Sina4ever 
          Beiträge: 76
 
 
 
 
 | 
Verfasst: Mo 14.08.06 11:57 
 
Hallo, kann mir jemand mal ein einfaches Thread beispiel geben...das Tutorial von Luckie oder eher gesagt die Beispiele sind mir noch zu kompliziert, oder einfach zu schwer zum lesen!
 unter verwendung der vcl bitte!
 | 
|  | 
| Gausi 
          Beiträge: 8550
 Erhaltene Danke: 478
 
 Windows 7, Windows 10
 D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
 
 | 
Verfasst: Mo 14.08.06 14:50 
 
Im Tutorial von Luckie gibt es auch ein letztes Kapitel, welches auf die Klasse TThread eingeht. Nicht immer ist das letzte auch das komplizierteste. Probier das mal aus - das ist recht einfach zu verstehen. _________________ We are, we were and will not be.
 | 
|  | 
| Sina4ever  
          Beiträge: 76
 
 
 
 
 | 
Verfasst: Di 15.08.06 20:45 
 
ja verstehe das so halb, brauche noch nen ganz einfaches beispiel... | 
|  | 
| Narses 
          
  Beiträge: 10183
 Erhaltene Danke: 1256
 
 W10ent
 TP3 .. D7pro .. D10.2CE
 
 | 
Verfasst: Di 15.08.06 22:48 
 
Moin!
 	  |  Sina4ever hat folgendes geschrieben: |  	  | ja verstehe das so halb, brauche noch nen ganz einfaches beispiel... | 
 Also, du hast ein Tut, du hast da Beispiele, du hast auch was davon verstanden, dann würde ich sagen, du zeigst uns einfach mal deinen Code für einen eigenen Thread-Versuch und wir finden raus, was daran nicht OK ist, hm?    cu
 Narses_________________ There are 10 types of people - those who understand binary and those who don´t.
 | 
|  | 
| Sina4ever  
          Beiträge: 76
 
 
 
 
 | 
Verfasst: Mi 16.08.06 17:21 
 
code bekomm ich noch nicht mal hin,
 ich möchte eigentlich einfach nur ne procedure..sagen wir mal
 		                       Delphi-Quelltext 
 									| 1:2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
 10:
 11:
 
 | procedure holexmldaten;var
 temp : string;
 begin
 try
 temp := idhttp1.get(url);
 finally
 end;
 end;
 |  in einem Thread ausführen... Doch wo muss ich was hinpacken und wie muss ich was aufrufen damit ich das hinbekomme. evtl. wird die procedure auch mehrmals hintereinander aufgerufen... | 
|  | 
| Martin1966 
          Beiträge: 1068
 
 Win 2000, Win XP
 Delphi 7, Delphi 2005
 
 | 
Verfasst: Do 17.08.06 08:11 
 
Guten Morgen    	  |  Sina4ever hat folgendes geschrieben: |  	  | in einem Thread ausführen... Doch wo muss ich was hinpacken und wie muss ich was aufrufen damit ich das hinbekomme. evtl. wird die procedure auch mehrmals hintereinander aufgerufen... | 
 ich kenne das besagte Tutorial nicht aber ich glaube kaum, dass so etwas grundlegendes nicht erklärt wird.
 Du musst (wenn du die VCL Variante benutzt) eine Ableitung von TThread erstellen und dort die Methode Execute  implementieren. In diese Methode packst du dann den Sourcecode der im Thread ausgeführt wird.
 Such mal hier im Forum nach   TTHREAD UND EXECUTE .
 Lg Martin_________________ Ein Nutzer der Ecke    | 
|  | 
| Sina4ever  
          Beiträge: 76
 
 
 
 
 | 
Verfasst: So 20.08.06 11:08 
 
ja das weiß ich, aber wo muss das ganze gesynct werden, etc. bei luckie um tut sind das so viele teile im code... | 
|  | 
| Narses 
          
  Beiträge: 10183
 Erhaltene Danke: 1256
 
 W10ent
 TP3 .. D7pro .. D10.2CE
 
 | 
Verfasst: So 20.08.06 11:57 
 
Moin!
 	  |  Sina4ever hat folgendes geschrieben: |  	  | ja das weiß ich, aber wo muss das ganze gesynct werden | 
 Was willst du denn womit synchronisieren?    Hast du denn den Sinn von Synchronize() verstanden?    cu
 Narses_________________ There are 10 types of people - those who understand binary and those who don´t.
 | 
|  | 
| Sina4ever  
          Beiträge: 76
 
 
 
 
 | 
Verfasst: So 20.08.06 12:47 
 
ja damit ich die ausgabe in der vcl syncronisiere...also bitte macht mir doch mal ein beispielt! | 
|  | 
| Sina4ever  
          Beiträge: 76
 
 
 
 
 | 
Verfasst: So 20.08.06 12:48 
 
macht mir doch mal bitte ein projekt per vcl wo ich auf nen button klicke und ne procedure mit ausgabe in der vcl in einem thread gemacht wird...dann kann ich ja sehen wie ich was machen muss und schreibe es dann auf meine bedürfnisse um! | 
|  | 
| Blackheart666 
          Beiträge: 2195
 
 XP
 D3Prof, D6Pers.
 
 | 
Verfasst: So 20.08.06 13:25 
 
Schau mal hier, vieleicht hilft Dir das weiter !?
hsg.region-kaisersla...hi/threads/index.php | 
|  | 
| Sina4ever  
          Beiträge: 76
 
 
 
 
 | 
Verfasst: So 20.08.06 13:55 
 
ok, hab jetzt mal was geschrieben, doch jetzt bekomme ich ne fehlermeldung mit idhttp protocol error:
 Anwendung:
 												| 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:
 
 | unit Unit1;
 interface
 
 uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls,unit2, IdBaseComponent, IdComponent, IdTCPConnection,
 IdTCPClient, IdHTTP;
 
 type
 TForm1 = class(TForm)
 Memo1: TMemo;
 Button1: TButton;
 IdHTTP1: TIdHTTP;
 procedure Button1Click(Sender: TObject);
 private
 Pieps : MeinThread;
 public
 
 end;
 
 var
 Form1: TForm1;
 
 implementation
 
 {$R *.dfm}
 
 procedure TForm1.Button1Click(Sender: TObject);
 begin
 Pieps := MeinThread.create(false);
 
 end;
 
 end.
 |  und jetzt die Thread Unit:
 												| 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:
 
 | unit Unit2;
 interface
 
 uses
 Classes;
 
 type
 MeinThread = class(TThread)
 private
 
 public
 procedure UpdateCaption;
 protected
 procedure Execute; override;
 end;
 
 var
 temp : string = '';
 
 
 
 implementation
 
 
 
 
 
 uses unit1;
 
 procedure MeinThread.Execute;
 begin
 temp := form1.idhttp1.get('www.google.de');
 Synchronize(UpdateCaption);
 
 
 end;
 
 
 
 procedure MeinThread.UpdateCaption;
 begin
 Form1.memo1.text := temp;
 end;
 end.
 |  Also was mache ich falsch?
 Sina | 
|  | 
| Narses 
          
  Beiträge: 10183
 Erhaltene Danke: 1256
 
 W10ent
 TP3 .. D7pro .. D10.2CE
 
 | 
Verfasst: So 20.08.06 14:32 
 
Moin!
 Wenn du nur am Ende ein Ergebnis des Threads auswerten/verarbeiten willst, brauchst du Synchronize() nicht, das ist nur zur Laufzeit des Threads nötig. In diesem Fall würde ich dir das Ereignis OnTerminate empfehlen, das im Kontext des Hauptthreads ausgeführt wird:
 												| 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:
 
 | unit Unit1;
 interface
 
 uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, IdHttp;
 
 type
 TForm1 = class(TForm)
 Memo1: TMemo;
 Button1: TButton;
 procedure Button1Click(Sender: TObject);
 procedure MyCallback(Sender: TObject);
 private
 
 public
 
 end;
 
 THttpThread = class(TThread)
 private
 FResult: String;
 public
 constructor Create(Callback: TNotifyEvent);
 procedure Execute; override;
 property Result: String read FResult;
 end;
 
 var
 Form1: TForm1;
 
 implementation
 
 {$R *.dfm}
 
 constructor THttpThread.Create(Callback: TNotifyEvent);
 begin
 inherited Create(FALSE);   OnTerminate := Callback;   FreeOnTerminate := TRUE; end;
 
 procedure THttpThread.Execute;
 var
 IdHttp: TIdHttp;
 begin
 IdHttp := TIdHttp.Create(NIL);
 FResult := IdHttp.Get('http://www.google.de');
 IdHttp.Free;
 end;
 
 
 procedure TForm1.Button1Click(Sender: TObject);
 begin
 Memo1.Clear;
 THttpThread.Create(MyCallback);
 Memo1.Lines.Add('Start: '+IntToStr(GetTickCount));
 end;
 
 procedure TForm1.MyCallback(Sender: TObject);
 begin
 Memo1.Lines.Add('Ende: '+IntToStr(GetTickCount));
 Memo1.Lines.Add(THttpThread(Sender).Result);
 end;
 
 end.
 |  cu
 Narses_________________ There are 10 types of people - those who understand binary and those who don´t.
 | 
|  | 
| Sina4ever  
          Beiträge: 76
 
 
 
 
 | 
Verfasst: So 20.08.06 15:08 
 
das verstehe ich jetzt wieder nicht, kannst du's anhand meines beispiels erklären?
 ich brauche ja auch zur laufzeit des threads die synchronisation, das ist halt nur im beispiel nicht so, weil ichs einfach halten wollte...
 
 aber wieso kann ich nicht auf idhttp zugreifen...oder wieso kommt da der fehler?
 | 
|  | 
| Narses 
          
  Beiträge: 10183
 Erhaltene Danke: 1256
 
 W10ent
 TP3 .. D7pro .. D10.2CE
 
 | 
Verfasst: So 20.08.06 22:25 
 
Moin!
 	  |  Sina4ever hat folgendes geschrieben: |  	  | das verstehe ich jetzt wieder nicht | 
 Sag mal, du hast Probleme mit   Luckie s Tut ("bei luckie um tut sind das so viele teile im code"), du verstehst mein relativ einfaches Beispiel nicht, bist du sicher, dass Threadprogrammierung nicht vielleicht noch eine Spur zu hoch für dich ist...      (nicht böse sein, aber was willst du denn haben? c&p-fähigen Code? den gibt´s für Threads nicht...)
 	  |  Sina4ever hat folgendes geschrieben: |  	  | kannst du's anhand meines beispiels erklären? | 
 Das habe ich doch in meinem Beispiel getan, es tut doch genau das gleiche...    OK, ich habe nicht Synchronize() benutzt, aber das da rein zu stricken, kann ja nicht wirklich ein Problem sein, oder?    	  |  Sina4ever hat folgendes geschrieben: |  	  | aber wieso kann ich nicht auf idhttp zugreifen...oder wieso kommt da der fehler? | 
 Du gibst in deinem Beispiel den Thread nicht wieder frei und die Http-Kompo verwendest du im Thread-Kontext, also mußt du die auch Thread-lokal anlegen.
 cu
 Narses_________________ There are 10 types of people - those who understand binary and those who don´t.
 | 
|  | 
| Sina4ever  
          Beiträge: 76
 
 
 
 
 | 
Verfasst: Mo 21.08.06 13:11 
 
und wie lege ich sie im thread lokal an? und ich möchte das schon gern mit ner zweiten unit extra für den thread! | 
|  | 
| Narses 
          
  Beiträge: 10183
 Erhaltene Danke: 1256
 
 W10ent
 TP3 .. D7pro .. D10.2CE
 
 | 
Verfasst: Mo 21.08.06 13:14 
 
	  |  Narses hat folgendes geschrieben: |  	  | 		                       Delphi-Quelltext 
 									| 1:2:
 3:
 4:
 5:
 6:
 7:
 8:
 
 | procedure THttpThread.Execute;var
 IdHttp: TIdHttp;
 begin
 IdHttp := TIdHttp.Create(NIL);
 FResult := IdHttp.Get('http://www.google.de');
 IdHttp.Free;
 end;
 |  | 
_________________ There are 10 types of people - those who understand binary and those who don´t.
 | 
|  | 
| Sina4ever  
          Beiträge: 76
 
 
 
 
 | 
Verfasst: Mo 21.08.06 13:24 
 
Danke und Sorry das ich nicht so einfach bin...aber will ja auch nur ein bischen dazulernen...Schau dir doch bitte noch mal beide Codeteile an, zu funktionieren scheints jetzt, evtl habe ich aber noch was falsch:
 												| 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:
 
 | unit Unit1;
 interface
 
 uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls,unit2;
 
 type
 TForm1 = class(TForm)
 Memo1: TMemo;
 Button1: TButton;
 procedure Button1Click(Sender: TObject);
 private
 Pieps : MeinThread;
 public
 
 end;
 
 var
 Form1: TForm1;
 
 implementation
 
 {$R *.dfm}
 
 procedure TForm1.Button1Click(Sender: TObject);
 begin
 Pieps := MeinThread.create(false);
 
 end;
 
 end.
 |  und die thread unit:
 												| 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:
 
 | unit Unit2;
 interface
 
 uses
 Classes,IdBaseComponent, IdComponent, IdTCPConnection,
 IdTCPClient, IdHTTP;
 
 type
 MeinThread = class(TThread)
 private
 
 public
 procedure UpdateCaption;
 protected
 procedure Execute; override;
 end;
 
 var
 temp : string = '';
 
 
 
 implementation
 
 
 
 uses unit1;
 
 procedure MeinThread.Execute;
 var
 IdHttp: TIdHttp;
 begin
 IdHttp := TIdHttp.Create(NIL);
 temp := IdHttp.Get('http://www.google.de');
 IdHttp.Free;
 Synchronize(UpdateCaption);
 end;
 
 
 
 procedure MeinThread.UpdateCaption;
 begin
 Form1.memo1.text := temp;
 end;
 end.
 |  | 
|  | 
| Narses 
          
  Beiträge: 10183
 Erhaltene Danke: 1256
 
 W10ent
 TP3 .. D7pro .. D10.2CE
 
 | 
Verfasst: Mo 21.08.06 13:28 
 
Moin!
 Du gibst immer noch nicht den beendeten Thread frei. Entweder wie in meinem Beispiel im Konstruktor FreeOnTerminate auf TRUE setzen oder später manuell freigeben, aber so ist das ein Speicherleck.    cu
 Narses_________________ There are 10 types of people - those who understand binary and those who don´t.
 | 
|  | 
| Sina4ever  
          Beiträge: 76
 
 
 
 
 | 
Verfasst: Mo 21.08.06 13:34 
 
ok, danke narses, hab jetzt noch 
pieps.FreeOnTerminate := true;  hinzugefügt..
 Kannst du mir jetzt noch sagen wie ich dem Thread, oder eher gesagt dem idhttp1.get eine url aus der Hauptform mit übergeben kann?
 Danke Danke Danke, dann wars das auch   | 
|  |