Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Threads!? Wie geht das? (https://www.delphipraxis.net/65724-threads-wie-geht-das.html)

Neuni 20. Mär 2006 16:25


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.

konda 20. Mär 2006 16:27

Re: Threads!? Wie geht das?
 
Vielleicht hilft dir das Thread-Tutorial auf Luckie Thread Tutorial :P

ichbins 20. Mär 2006 16:28

Re: Threads!? Wie geht das?
 
oder du schaust dir Luckies Ping-Programm (Open-Source) an, das gerade auch hier läuft ;) LuckiePing

Neuni 20. Mär 2006 16:30

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?

Matze 20. Mär 2006 16:33

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 dieses hier.

Neuni 20. Mär 2006 17:04

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:
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;
Er macht zwar das Update...aber es hackt immer noch alle 2 sek. :(

glkgereon 20. Mär 2006 17:06

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...

pacman1986 20. Mär 2006 17:07

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

Neuni 20. Mär 2006 17:09

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?

pacman1986 20. Mär 2006 17:12

Re: Threads!? Wie geht das?
 
das darf eigentlich nicht passieren..
hängt jedoch von deinem thread ab

Delphi-Quellcode:
Thread.Terminate;

Neuni 20. Mär 2006 17:14

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

pacman1986 20. Mär 2006 17:18

Re: Threads!? Wie geht das?
 
greift der thread direkt auf eine der komponenten der ersten Unit zu ?

Neuni 20. Mär 2006 17:24

Re: Threads!? Wie geht das?
 
Siehste ja im 6. Post...eigendlich schon. idhttp is ja zb. eine oder chat (is n richedit)

Khabarakh 20. Mär 2006 17:25

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

Neuni 20. Mär 2006 19:45

Re: Threads!? Wie geht das?
 
Hmm...Lösungsvorschlag: ?

pacman1986 20. Mär 2006 20:06

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

Neuni 20. Mär 2006 20:16

Re: Threads!? Wie geht das?
 
Ok...eine Frage noch fürs erste: Wie lass ich den Thread alle 2 sek. neu ausführen?

pacman1986 20. Mär 2006 20:27

Re: Threads!? Wie geht das?
 
ich hätte eine extrem kranke unedlichkeits abfrage gemacht

Delphi-Quellcode:
i:=0;
while i=0 do begin
 ...
 delay(2000);
end;
es gibt betimmt elegantere und weniger speicher auslastende möglichkeiten ....

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

Neuni 20. Mär 2006 21:19

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.

pacman1986 20. Mär 2006 21:41

Re: Threads!? Wie geht das?
 
versuchs mal mit self

Neuni 21. Mär 2006 11:37

Re: Threads!? Wie geht das?
 
Auch schon probiert...das geht aber net :(
Zitat:

[Error] Unit1.pas(564): Incompatible types: 'TComponent' and 'TGetRemoteVersionThread'
[Fatal Error] Project1.dpr(6): Could not compile used unit 'Unit1.pas'

Angel4585 21. Mär 2006 11:39

Re: Threads!? Wie geht das?
 
versuchs mal mit "nil" sollte gehen

Neuni 22. Mär 2006 17:06

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;

ste_ett 22. Mär 2006 17:21

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;

Neuni 24. Mär 2006 20:24

Re: Threads!? Wie geht das?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hmm...irgendwie macht das "GetIt.Create(nil);" n Problem (siehe Anhang).

ste_ett 24. Mär 2006 21:03

Re: Threads!? Wie geht das?
 
Bei mir geht's.
Zeig mal die komplette Execute-Prozedur.

Neuni 25. Mär 2006 11:22

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;

ste_ett 25. Mär 2006 12:14

Re: Threads!? Wie geht das?
 
"GetIt" muss erzeugt werden.

Delphi-Quellcode:
GetIt := TIdHTTP.Create(nil);


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:50 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz