![]() |
Threads!? Wie geht das?
Hi,
also da ich verdammt lange kein Delphi mehr gemacht habe (mit PHP kann man mehr Geld machen ;) ), brauch ich mal wieder ein bisschen Hilfe. Also ich hab n Timer der alle 2 Sekunden einen String vom Server holt per idhttp.get. Nun hackt das ein bisschen wenn ich den holen lasse. Grade bei einer langsameren Internetanbindung nicht so toll ;) Nun gibts da ja die wunderbaren Threads, wobei allerdings kein beispiel oder tut bei mir funktioniert :) Hat vielleicht Jemand so ein Idiotensicheres Beispiel wie ich das mache? Brauch Delphi eigendlich so gut wie nie in letzter Zeit deshalb hab ich auch nicht die Lust/die Zeit mich da groß einzulesen. Nervt halt nur n bisschen wenn alles alle 2 sek. hängt ;) Danke schonmal. |
Re: Threads!? Wie geht das?
Vielleicht hilft dir das Thread-Tutorial auf
![]() |
Re: Threads!? Wie geht das?
oder du schaust dir Luckies Ping-Programm (Open-Source) an, das gerade auch hier läuft ;)
![]() |
Re: Threads!? Wie geht das?
Hmm...ja.
Nur müsste ich da 45 Seiten lesen (anders gehts ja nicht wegen dem Zusammenhang). Und die zeit hab ich leider im Moment nicht. (Auch wenn ich sie gerne hätte :? ) Edit: Ach der Luckie macht aber immer alles nonVCL. (der hat ja auch n Plan von Delphi ;) ) Edit II: Was is denn mit diesem idthreadmanager und co? |
Re: Threads!? Wie geht das?
Hi
Dann bemühe eben die Suche, da findest du wirklich sehr viel, u.a. auch schöne Beispiele, wie ![]() |
Re: Threads!? Wie geht das?
hey...es geht :)
Also der thread anscheinend. Nun hab ich das mal kopiert und mein Zeugs eingefügt: (Kleiner ausschnitt)
Delphi-Quellcode:
Er macht zwar das Update...aber es hackt immer noch alle 2 sek. :(
procedure TGetRemoteVersionThread.UpdateCaption;
var new:string; begin with Form1 do begin /// //chat.Lines.Clear; new := idhttp1.Get(URL+'/admin.php?nick='+nick+'&pw='+pw+'&go=getchat'+'&casenick='+casenick+'&lastid='+lastid); new := StringReplace(new, '###', #13#10, [rfReplaceAll]); if (new = '') OR (new = ' ') then begin end else begin chat.Lines.Add(new); end; lastid := idhttp1.Get(URL+'/admin.php?nick='+nick+'&pw='+pw+'&go=getlastid'+'&casenick='+casenick); /// end; end; // ============================================================================= procedure TGetRemoteVersionThread.Execute; begin Synchronize(UpdateCaption); end; //////////////////////////////////////////////////////////////////// procedure TForm1.Timer2Timer(Sender: TObject); var Thread: TGetRemoteVersionThread; begin Thread := TGetRemoteVersionThread.Create(True); Thread.FreeOnTerminate := True; Thread.Resume; end; |
Re: Threads!? Wie geht das?
wie wäre es wenn du einmal den thread erstellst und der alle 2 Sekunden von selbst abruft?
erscheint mir logischer... |
Re: Threads!? Wie geht das?
oder terminier den thread ...
du erstellst ihn aber er bleibt im Arbeitsspeicher mach das ma ne 1/2 std je nachdem wie groß dein thread ist kann das ziemlich merkwürdig enden |
Re: Threads!? Wie geht das?
Und wenn mir jetzt noch einer sagt wie wär ich euch echt dankbar.
PS: Aber verursacht das das hacken des Programms? |
Re: Threads!? Wie geht das?
das darf eigentlich nicht passieren..
hängt jedoch von deinem thread ab
Delphi-Quellcode:
Thread.Terminate;
|
Re: Threads!? Wie geht das?
Joa...das hab ich grad auch schon gefunden...aber dann macht er garnix mehr :) Und bei doterminate macht er zware was...aber es hackt :)
|
Re: Threads!? Wie geht das?
greift der thread direkt auf eine der komponenten der ersten Unit zu ?
|
Re: Threads!? Wie geht das?
Siehste ja im 6. Post...eigendlich schon. idhttp is ja zb. eine oder chat (is n richedit)
|
Re: Threads!? Wie geht das?
@Neuni: Wenn du den performancekritischen Teil per Synchronize im VCL-Thread ablaufen lässt, hast du natürlich nichts gewonnen :stupid: .
|
Re: Threads!? Wie geht das?
Hmm...Lösungsvorschlag: ?
|
Re: Threads!? Wie geht das?
naja ...
idhttp dynamisch im thread erzeugen (lieber nur einen der alle 2 sec abgefragt wird). und dem thread dein richedit übergeben wo dann die info reingeschrieben wird |
Re: Threads!? Wie geht das?
Ok...eine Frage noch fürs erste: Wie lass ich den Thread alle 2 sek. neu ausführen?
|
Re: Threads!? Wie geht das?
ich hätte eine extrem kranke unedlichkeits abfrage gemacht
Delphi-Quellcode:
es gibt betimmt elegantere und weniger speicher auslastende möglichkeiten ....
i:=0;
while i=0 do begin ... delay(2000); end; naja das war mein erster gedanke Edit : Mein 2 ter Gedanke einfach eine funktion oder procedur schreiben die alle 2 sec mit dem timer aufgerufen wird |
Re: Threads!? Wie geht das?
Hmm...wenn ich nun den idhttp erstellen will brauch der ja ne kompo im create(). Was geb ich da nu an!? Form1 solls ja grade nicht denk ich ma. Und wenn ich ne andere nehme nützt das ja auch nix.
|
Re: Threads!? Wie geht das?
versuchs mal mit self
|
Re: Threads!? Wie geht das?
Auch schon probiert...das geht aber net :(
Zitat:
|
Re: Threads!? Wie geht das?
versuchs mal mit "nil" sollte gehen
|
Re: Threads!? Wie geht das?
Hmm...immer noch alle 2 sek :(
Delphi-Quellcode:
procedure TGetRemoteVersionThread.UpdateCaption;
var new:string; getit:Tidhttp; begin with Form1 do begin /// getit := Tidhttp.Create(nil); //chat.Lines.Clear; //new := idhttp1.Get(URL+'/admin.php?nick='+nick+'&pw='+pw+'&go=getchat'+'&casenick='+casenick+'&lastid='+lastid); new := getit.get(URL+'/admin.php?nick='+nick+'&pw='+pw+'&go=getchat'+'&casenick='+casenick+'&lastid='+lastid); new := StringReplace(new, '###', #13#10, [rfReplaceAll]); if (new = '') OR (new = ' ') then begin end else begin chat.Lines.Add(new); end; lastid := getit.get(URL+'/admin.php?nick='+nick+'&pw='+pw+'&go=getlastid'+'&casenick='+casenick); /// end; end; // ============================================================================= procedure TGetRemoteVersionThread.Execute; begin Synchronize(UpdateCaption); end; //////////////////////////////////////////////////////////////////// procedure TForm1.Timer2Timer(Sender: TObject); var Thread: TGetRemoteVersionThread; begin Thread := TGetRemoteVersionThread.Create(True); Thread.FreeOnTerminate := True; Thread.Resume; thread.DoTerminate; end; |
Re: Threads!? Wie geht das?
Da darfst den Text nicht im Syncronize()-Teil runterladen.
Warum erzeugst du TidHttp auf der Form? Klar, dass das die Form mit "runterzieht". :) Ändere die Struktur mal ein bisschen:
Delphi-Quellcode:
TThreadName.Execute;
var sTemp: String; GetIt: TidHttp; begin // Runterladen im Thread GetIt.Create(nil); try sTemp := GetIt.Get(''); finally GetIt.Free; end; // Text aktualisieren auf der Form Syncronize(Update); end; |
Re: Threads!? Wie geht das?
Liste der Anhänge anzeigen (Anzahl: 1)
Hmm...irgendwie macht das "GetIt.Create(nil);" n Problem (siehe Anhang).
|
Re: Threads!? Wie geht das?
Bei mir geht's.
Zeig mal die komplette Execute-Prozedur. |
Re: Threads!? Wie geht das?
Delphi-Quellcode:
procedure TGetRemoteVersionThread.Execute;
var sTemp: String; GetIt: TidHttp; begin // Runterladen im Thread GetIt.Create(nil); try new := getit.get(URL+'/admin.php?nick='+nick+'&pw='+pw+'&go=getchat'+'&casenick='+casenick+'&lastid='+lastid); new := StringReplace(new, '###', #13#10, [rfReplaceAll]); lastid := getit.get(URL+'/admin.php?nick='+nick+'&pw='+pw+'&go=getlastid'+'&casenick='+casenick); finally GetIt.Free; end; // Text aktualisieren auf der Form Synchronize(Updateit); end; procedure TGetRemoteVersionThread.Updateit; begin if (new = '') OR (new = ' ') then begin end else begin form1.chat.Lines.Add(new); end; end; procedure TForm1.Timer2Timer(Sender: TObject); var Thread: TGetRemoteVersionThread; begin Thread := TGetRemoteVersionThread.Create(True); Thread.FreeOnTerminate := True; Thread.Resume; thread.DoTerminate; end; |
Re: Threads!? Wie geht das?
"GetIt" muss erzeugt werden.
Delphi-Quellcode:
GetIt := TIdHTTP.Create(nil);
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:14 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz