Entwickler-Ecke
Sonstiges (Delphi) - einfaches Thread Beispiel!
Sina4ever - Mo 14.08.06 12:57
Titel: einfaches Thread Beispiel!
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 - Mo 14.08.06 15: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.
Sina4ever - Di 15.08.06 21:45
ja verstehe das so halb, brauche noch nen ganz einfaches beispiel...
Narses - Di 15.08.06 23: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
Sina4ever - Mi 16.08.06 18: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 - Do 17.08.06 09:11
Guten Morgen :wink2:
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
Sina4ever - So 20.08.06 12: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 - So 20.08.06 12:57
Moin!
Sina4ever hat folgendes geschrieben: |
ja das weiß ich, aber wo muss das ganze gesynct werden |
Was willst du denn womit synchronisieren? :gruebel:
Hast du denn den Sinn von Synchronize() verstanden? ;)
cu
Narses
Sina4ever - So 20.08.06 13:47
ja damit ich die ausgabe in der vcl syncronisiere...also bitte macht mir doch mal ein beispielt!
Sina4ever - So 20.08.06 13: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!
Sina4ever - So 20.08.06 14:55
ok, hab jetzt mal was geschrieben, doch jetzt bekomme ich ne fehlermeldung mit idhttp protocol error:
Anwendung:
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:
| 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:
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:
| 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 - So 20.08.06 15: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:
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:
| 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
Sina4ever - So 20.08.06 16: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 - So 20.08.06 23:25
Moin!
Sina4ever hat folgendes geschrieben: |
das verstehe ich jetzt wieder nicht |
Sag mal, du hast Probleme mit
Luckies 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... :gruebel: 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
Sina4ever - Mo 21.08.06 14: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 - Mo 21.08.06 14: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; | |
Sina4ever - Mo 21.08.06 14: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:
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:
| 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:
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:
| 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 - Mo 21.08.06 14: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
Sina4ever - Mo 21.08.06 14: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 :-)
Narses - Mo 21.08.06 14:45
Moin!
Sina4ever hat folgendes geschrieben: |
pieps.FreeOnTerminate := true; hinzugefügt.. |
Das ist unsauber aus dem Hauptthread heraus, das gehört in den Konstruktor (du weißt ja schließlich nicht, wie schnell der Thread terminiert...).
Sina4ever hat folgendes geschrieben: |
Kannst du mir jetzt noch sagen wie ich dem Thread, oder eher gesagt dem idhttp1.get eine url aus der Hauptform mit übergeben kann? |
Z.B. über den Konstruktor und eine lokale Variable des Threads:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| type THttpThread = class(TThread) private FURL: String; public constructor Create(const AURL: String); procedure Execute; override; end;
constructor THttpThread.Create(const AURL: String); begin inherited Create(FALSE); FreeOnTerminate := TRUE; FURL := AURL; end;
MyThread := THttpThread.Create('http://www.google.de'); |
cu
Narses
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!