![]() |
Problem mit TidHTTP in Thread
Hallo zusammen,
Ich hab folgendes Problem: ich progge ein Spiel welches über due TIdHTTP-Komponente mit php-Skripten kommuniziert. In diesem Spiel kann man IGMs(In-Game-Messages) verschicken und empfangen. Das empfangen dieser IGMs wollte ich in einem extra Thread machen, da sonst das Spiel immerwieder mal kuz hängen könnte. Jetzt habe ich allerings das Problem, dass - obwohl ich das ganze in dem extra Thread mache und nur kurz für die Anzeige der Anzahl der Nachrichten den Hauptthread beanspruche - der Hauptthread für ca. 10 Sekunden komplett hängt. Weis jemand ob das an der TIdHTTP-Kompo liegt, dass die vllt generell das ganze Programm lahmlegt während sie ein POST ausführt oder ich da was anderes falsch machen könnte? MfG :angel: |
Re: Problem mit TidHTTP in Thread
es liegt definitiv nicht an der TIdHTTP-Compo sondern mit aller Wahrscheinlichkeit an der Handhabung.
Was genau du bei der Handhabung falsch machst ist jedoch ohne Quelltext schwer zu sagen. |
Re: Problem mit TidHTTP in Thread
Ich habe das gleiche Problem.
![]() Die Handhabung ist normal wie sie in den Beispielen hier gepostet ist.. z.B
Delphi-Quellcode:
Unterscheidet sich deine Handhabung von dieser...!?
LParams := TStringlist.Create;
LParams.Add('variable=wert'); response := IdHTTP1.Post('http://'+form1.DatabaseServerEdit.Text+'/delphi.php', LParams); |
Re: Problem mit TidHTTP in Thread
Hi,
ich kann nur sagen ich benutze die IdHttp(9er Version) in diversen Projekten innerhalb eines Threads. ,eistens auch um mit einem PHP-Script zu kommunizieren. Bei mir geht alles perfekt. Zeig mal ein bisschen Code ;-) Was ich ohne Code nur vermuten kann ist das Du vielleicht kein TAntifreeze auf Deiner Main-Form hast?! Gruß Data |
Re: Problem mit TidHTTP in Thread
BTW, wäre TCP/IP nicht geeigneter?
|
Re: Problem mit TidHTTP in Thread
[IRONIE]Vermutlich nicht, da müsste man das HTTP Protokoll ja nachbauen[/IRONIE]
|
Re: Problem mit TidHTTP in Thread
hat sich erledigt, ich hatte eine Komponente des Hauptformulars in der Prozedur mit der TIdHTTP-Kompo verwendet, jetz hab ich die rausgeschmissen un es funktioniert :wall:
|
Re: Problem mit TidHTTP in Thread
@Stefan Hueg: Ich meinte ohne PHP.
Dass man auf dem Server ASP.NET oder ein Servlet oder wasweißich laufen lässt, der auf irgendnem Port das ganze empfängt. |
Re: Problem mit TidHTTP in Thread
Ahso ich verstehe. Wobei man dann gleich ne stinknormale Serveranwendung schreiben könnte :)
@Topic: Ich denke du wolltest das wegen einer zentralen Messaging-Möglichkeit machen, nicht? |
Re: Problem mit TidHTTP in Thread
ne ich progge ein Game in Delphi, mit TIdHTTP schick ich Nickname, und NAchricht an ein Skript. Das Skript speichert diese dann in eine MySQL Datenbank.
Jetzt gibt es gleichzeitig ein Thread der ein anderes Skript aufruft und von diesem die Anzahl der vorhandenen Nachrichten für den eigenen Nick zurückbekommt. Das Problem war jetzt einfach das ich die Anzahl der Nachrichten im Hintergrund des Programms ermitteln will und dann evtl falls eine neue Nachricht eintrifft eine Meldung an den Benutzer ausgebe. |
Re: Problem mit TidHTTP in Thread
Zitat:
hängt es eventuell damit...!? Das ist die Procedure
Delphi-Quellcode:
procedure TmySqlClass.PSaveToSQL(NewArray : TList; ID : integer);
var i : integer; Response : String; LParams : TStringlist; n : string; begin LParams := TStringlist.Create; LParams.Add('QUERY=SAVE'); n := inttostr(0); try for i := 0 to NewArray.Count -1 do begin if (TDateien(NewArray.items[i]^).Available = false) then begin LParams.Add( 'id'+n+'='+inttostr(ID)); LParams.Add( 'filename'+n+'='+TDateien(NewArray.items[i]^).Filename); LParams.Add( 'size'+n+'='+inttostr(TDateien(NewArray.items[i]^).size)); LParams.Add( 'typ'+n+'='+StringReplace(TDateien(NewArray.items[i]^).typ,'.','',[rfReplaceAll])); LParams.Add( 'sprache'+n+'='+TDateien(NewArray.items[i]^).Leanguage); LParams.Add( 'erstellt'+n+'='+FormatDateTime('yyyy-mm-dd hh:mm:ss', TDateien(NewArray.items[i]^).Create)); LParams.Add( 'geaendert'+n+'='+FormatDateTime('yyyy-mm-dd hh:mm:ss', TDateien(NewArray.items[i]^).Modified)); LParams.Add( 'md5'+n+'='+TDateien(NewArray.items[i]^).MD5); n:= inttostr(strtoint(n)+1); //sleep(3); end; // if end; // for response := IdHTTP1.Post('http://www.server.de/delphi.php', LParams); //showmessage(response); except on e:exception do showmessage(e.Message); end; LParams.Free; end; |
Re: Problem mit TidHTTP in Thread
Hi,
damit die Hauptanwendung nicht blockiert wird sollte das IdHttp in einem Thread ausgelagert werden ! Des weiteren sollte auf der Main-Form ein TIdAntifreeze seien ! Und zu guter letzt muss alles was im Thread abläuft und auf andere Gui Elemente zugreift/ändert syncronisiert werden. Gruß Data |
Re: Problem mit TidHTTP in Thread
ich erzeuge die immer neu:
Delphi-Quellcode:
nein mein Problem war das ich im Hauptformular eine Komponente habe(TScrollbox) auf welche ich in dieser prozedur zugegriffen habe um mir etwas anderes anzigen zu lassen. Jetzt habe ich diesen Teil ausgelagert in eine extraProzedur und jetzt geht es.
with TIdHTTP.Create(nil) do
try . . . finally Free; end; Das mit dem TIdAntifreeze werd ich mir heut abend mal genauer anschauen. THX :thumb: |
Re: Problem mit TidHTTP in Thread
AntiFreeze funktioniert bei mir nie, und warum ziehst du das IdHTTP nicht einfach auf die Main Form? Alles andere ist Verschwendung von Rechenzeit (zugegeben, sehr wenig, aber trotzdem unnötig.)
|
Re: Problem mit TidHTTP in Thread
ja wenn ichs auf die Mainform setze dann hängt diese während ich im Thread die Anzahl der Nachrichten ermittle ;)
|
Re: Problem mit TidHTTP in Thread
@Angel4585:
Zitat:
Zitat:
Gruß Data |
Re: Problem mit TidHTTP in Thread
TIdAntiFreeze hatte bei mir auch noch nie funktioniert, habe es seitdem gelassen. Warum das nich geht? K.A.
|
Re: Problem mit TidHTTP in Thread
Bei mir gehts auch nie...
|
Re: Problem mit TidHTTP in Thread
AntiFreeze ist auch nicht notwendig wenn das ganze im Thread läuft. Im Gegensatz zur breiten Meinung finde ich schon das TIdHttp auch im Thread erstellt werden soll wenn es dort genutzt wird. Der Grund liegt in der Objectorientierung und der Vermeidung von Fehlern. Wenn die Http-Komponente nur im Thread benötigt wird gehört sie auch dort hin. Desweiteren ist damit sicher gestellt das die Komponente nicht von einem zweiten Thread gleichzeitig genutzt wird.
|
Re: Problem mit TidHTTP in Thread
Hi,
das IdHttp gehört in den Thread wie SirThornberry schon gesagt hat. Desweiteren ist es besser das TIdAntifreeze zu benutzen, selber auf die Form zu ziehen. Existiert kein TIdAntifreeze erzeugt Indy selber eine globale Instanz, das Antifreeze ist somit so oder so da. Nur wenn man es selbst auf die Form ziehst hat man noch die Mögleichkeit auf die Properties des Antifreeze Einfluss zu nehmen. Interessant sind da nämlich die Eigenschaften "ApplicationHasPriority", "OnlyWhenIdle", "IdleTimeOut" und "Active". Gruß Data |
Re: Problem mit TidHTTP in Thread
Bringt das Antifreece innerhalb eines Threads überhaupt was? letztendlich wird doch dabei ein Application.ProcessMessages aufgeführt was im Thread keine Wirkung hat da dieser ja eigentlich von der Oberfläche welche Message benötigt los gelöst ist.
|
Re: Problem mit TidHTTP in Thread
@SirThornberry:
Ich habe auch nicht gesagt das das TIdAntifreeze im Thread erzeugt werden soll ;-) Es gehört auf die Main-Form und stellt somit dann die globale Instanz die Indy ansonsten selbst erzeugen würde. Und somit erhält die Main-Form dann "Application.Processmessages" auch wenn der Thread gerade blocking calls aufruft. Gruß Data |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:31 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