Entwickler-Ecke

Internet / Netzwerk - Delphi arbeitet sehr lange...


Chiller - Fr 03.04.09 22:18
Titel: Delphi arbeitet sehr lange...
Hallo

ich bin gerade dabei einen "teletext" zu schreiben, bei dem man wie bei dem vom fernseher aber möglichst noch innerhalb einer sekunde abrufen kann...


der einfachkeit halber habe ich nun einfach den dax-punktewert von finanztreff.de auslesen und entsprechend auf der Seite in ein Label geschrieben!

nun ist mein problem dass dabei schon das programm 3 sekunden hängt, bzw es macht einfach nichts mehr, es kommt auch keine sanduhr, die uhr die ich eingebaut habe bleibt einfach stehen und das programm regt sich für 3 sekunden nicht mehr, die speicherauslastung im taskmanager zeigt auch keine erhöhung des verbrauchs...

was kann ich nun also tun wenn ich eine ganze nachrichtenseite innerhalb von 1 sekunde auslesen lassen möchte, dabei am ebsten noch ohne hängen(wobei mein pc nicht sonderlich schlecht ist und auch sonst selten hängt)?

schon mal danke für die antworten

Chiller


Marc. - Fr 03.04.09 22:26

Hey!
Ich fürchte, ohne Code oder nähere Beschreibung, wie du die Daten ausliest, werden wir dir wohl kaum weiterhelfen können. :nixweiss:
Du könntest allerdings deine Funktion zum Auslesen einen eigenen Thread spendieren, damit das Hauptprogramm nicht völlig blockiert wird. ;)


Chiller - Fr 03.04.09 22:45

das ist die procedure mit der ich den einen(!) wert auslesen...doch allein auf diese eine teletextseite sollen noch mindestens 4 andere kommen...

zu dem thread, leider habe ich erst seit einem dreiviertel jahr in der schule informatik lerne dort meiner meinung eh zu wenig, deshalb habe ich mir das mit dem textstellenauslesen selbst beigebracht...und weiß deshalb auch nicht ansatzweiße wie ich das mache war wir bis jetzt nur immer variabeln eingelesen und auf verschieden arten weiter verarbeitet haben...

MfG Chiller


JayEff - Fr 03.04.09 23:20

user profile iconChiller hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
Text:=HTTP.Get('http://finanztreff.de/');                    
Du kannst im Programm an den Anfang der Prozedur einen Haltepunkt setzen (F5 glaube ich) und dann, wenn das Programm dort anhält, per F8 zeilenweise durchgehen. Dabei wirst du merken, dass an dieser Zeile die meiste Zeit draufgeht, so vermute ich.
Während das idHTTP auf die Antwort der Seite und auf das herunterladen des Quellcodes wartet, kann die Prozedur unter keinen Umständen weiterlaufen.

Ich denke, dass du mit einem Thread am besten dran bist, aber ich kenn mich auf dem Gebiet leider noch nicht aus...
Wenn du nur einzelne Daten auslesen willst, sorge dafür, dass die Variable "text" nicht mehrmals beschrieben werden muss, du könntest sie global machen. Auf die Art minimierst du die "Einfrierzeit", falls du nur diese eine Seite abfragen musst.


Chiller - Fr 03.04.09 23:59

nein, geplant war dass ich noch ca 100 andere Textstellen aus Seiten auslese...

da kann ich nur probieren eine andere seite mit weniger quellcode zu bekommen, die er dann schneller laden kann...

danke für die antworten, außer jmd weiß noch irgend etwas...


tif - Sa 04.04.09 06:27

Hallo,

versuche mal, eine TIDAntiFreeze - Komponente mit in dein Formular zu ziehen. (Ungetestet.)

Tino


Chiller - Sa 04.04.09 13:32

was für eine komponente ist das /was macht die...habe ich noch nie gehört und weiß auch nicht wie ich das mache...

MfG Chiller


Chiller - Sa 04.04.09 15:51

mitlerweile schifft es das programm alle daten die ich auf einer seite anzeigen lassen will in 2 sekunden zu generieren indem ich alle daten von einer seite von nur einer webseite beziehe und somit den quellcode der seite nur einmal laden muss...


JayEff - Sa 04.04.09 16:05

user profile iconJayEff hat folgendes geschrieben Zum zitierten Posting springen:
sorge dafür, dass die Variable "text" nicht mehrmals beschrieben werden muss
Also hast du's so gemacht :zustimm:


Chiller - Sa 04.04.09 18:32

mitlerweile habe ich aber ein etwas größeres problem:

delphi schafft es zwar, den seitencode auszulesen, doch gibt mir keine variable zurück, das habe ich bereits mit mehreren seiten probiert und finde infach keine lösung...

probiert ahbe ich das immer mit folgendem code, wenn man den text ab MText.Text:=Text; bis zum nächsten end; als kommentar markiert und einfach den gesamten Quellcode mit MText.Text:=Text ins Memo schrieben lässt sieht man, dass er den code hat, doch wenn ich ein textstück heraus schneiden lassen will geht das nicht

die seite ist zb eine bei der es nicht funktioniert...


ich hoffe auf eine helfende Antwort :-)



MfG Chiller


jaenicke - Sa 04.04.09 18:44

Du musst deinem a gleich die Länge hinzuaddieren, du findest nämlich das Stück mit b und PosEx innerhalb deines ersten Suchstrings...

PosVariable solltest du vielleicht gleich benutzen statt den String doppelt manuell zu schreiben. ;-)


Chiller - Sa 04.04.09 19:04

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Du musst deinem a gleich die Länge hinzuaddieren, du findest nämlich das Stück mit b und PosEx innerhalb deines ersten Suchstrings...

PosVariable solltest du vielleicht gleich benutzen statt den String doppelt manuell zu schreiben. ;-)




die länge habe ich aj unten mit a+c hinzuaddiert, dass man das b stück in a findet ist nur zufalll...das nachdem ich mit b suche steht aj dann hinter dem a-text-stück...


das problem ist ja dass ich gar nichts herausgegeben bekomme, nicht dass er mir etwas falsches ausgibt...!

und ich wei´nicht woran das liegt, da dieses programm bei anderen webseiten ja perfekt funktioniert, nur bei einigen wie dieser nicht, dann wird gar nichts ausgegeben...


MfG Chiller


jaenicke - Sa 04.04.09 19:31

:roll:

Delphi-Quelltext
1:
2:
  a:=(Pos('>adidas</a></td><td width="50" align="right">', Text));
  b:=(Posex('</td><td', Text, a));
Du suchst mit PosEx ab dem Start des gefundenen Stücks, wie gesagt... Und deshalb findest du das jetzt markierte Stück...

Außerdem gehören die Klammern um alles nicht hin, an anderer Stelle verursacht das Fehler.


delphi10 - Sa 04.04.09 20:07

user profile iconChiller hat folgendes geschrieben Zum zitierten Posting springen:
was für eine komponente ist das /was macht die...habe ich noch nie gehört und weiß auch nicht wie ich das mache...

MfG Chiller


Eigentlich hilft ein "Application.ProcessMessages;" immer, damit nichts einfriert oder wenigstens der Ticker weiterläuft.


JayEff - Sa 04.04.09 20:17

user profile icondelphi10 hat folgendes geschrieben Zum zitierten Posting springen:
Eigentlich hilft ein "Application.ProcessMessages;" immer, damit nichts einfriert oder wenigstens der Ticker weiterläuft.
Dann bring mir mal ein Application.ProcessMessages in diesen Code ein: idHTTP1.Get('website'); :roll: Oder an welcher Stelle dieser einen Zeile glaubst du, ein Abarbeiten der Nachrichtenwarteschlange wäre sinnvoll?

Du könntest mit Suche in: Delphi-Forum URLDOWNLOADTOFILE (unit urlmon) arbeiten, da kannst du eine Callback-Prozedur angeben, die du nutzen kannst um eine Statusanzeige für den Download zu aktualisieren und dort könnte man tatsächlich ein Application.ProzessMessages anbringen wodurch das Einfrieren verhindert würde. Und man hätte eine Statusanzeige :)
Es gibt auch andere URLDownloadToXXX-Prozeduren mit denen du um das Zwischenspeichern als Datei herumkommen müsstest...


Chiller - Sa 04.04.09 21:14

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
:roll:

Delphi-Quelltext
1:
2:
  a:=(Pos('>adidas</a></td><td width="50" align="right">', Text));
  b:=(Posex('</td><td', Text, a));
Du suchst mit PosEx ab dem Start des gefundenen Stücks, wie gesagt... Und deshalb findest du das jetzt markierte Stück...

Außerdem gehören die Klammern um alles nicht hin, an anderer Stelle verursacht das Fehler.




in diesem fall sit das anders, cih ahbe das ja mit etwas hilfe selbst geschrieben, nicht kopiert...


in diesem fall wird der text durchsucht...der ist der quellcode der oben als erstes eingefügten seite, a ist die erste koordinate ab wo das was ich auslesen lasse beginnt, b die stelle an der ich den nach a weiterführede text wieder abschneiden lasse, der ja nach a beginnt...
und c musste ich als länge hinzufügen, da er warum auch immer die variable zuvor ausgelsen hat...

dass b nochmal in a vorkommt ist nur zufall da das was ich haben will zwischen den text von a und b steht...und es ein html code und a länger ist dass er auch die richtige stelle im quellcode findet...

MfG Chiller


JayEff - Sa 04.04.09 21:20

user profile iconChiller hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Außerdem gehören die Klammern um alles nicht hin, an anderer Stelle verursacht das Fehler.
in diesem fall sit das anders, cih ahbe das ja mit etwas hilfe selbst geschrieben, nicht kopiert...

Bezieht sich dein Kommentar auf die Klammern? Falls ja, die gehören da nicht hin, fertig aus.

user profile iconChiller hat folgendes geschrieben Zum zitierten Posting springen:
in diesem fall wird der text durchsucht...der ist der quellcode der oben als erstes eingefügten seite, a ist die erste koordinate ab wo das was ich auslesen lasse beginnt, b die stelle an der ich den nach a weiterführede text wieder abschneiden lasse, der ja nach a beginnt...
und c musste ich als länge hinzufügen, da er warum auch immer die variable zuvor ausgelsen hat...

dass b nochmal in a vorkommt ist nur zufall da das was ich haben will zwischen den text von a und b steht...und es ein html code und a länger ist dass er auch die richtige stelle im quellcode findet

Glaub jaenicke, in b steht nach deinem Aufruf nichts anderes als a + 11, da in a die Position des ersten Zeichens '>' steht. Du müsstest als letzten Parameter für PosEx nicht a sondern a + 45 übergeben, damit er auch wirklich hinter 'align="right">' weitersucht.


Chiller - Sa 04.04.09 21:50

ok, jetzt glaube ich ihn, jetzt hab ichs verstanden :-)

ich hoffe damit komme ich nun weiter, danke!


Chiller - So 05.04.09 01:17

noch eine frage zum teilstring von pos:

ich benötige um die position bestimmen zu können den vorherigen und universellen code, doch nun habe ich das problem dass dieser nur iniversell ist wnen er eine bestimtme länge hat und sich deshalb darin andere stringteile befinden, die sich verändern...
wie kann ich nun also diese teilstücke aus meinem teilsting ausblenden, dass sie bei der suche keine rolle spielen, gibt es eine andere möglichkeit als diese wiederrum auslesen und dann in den suchtext einfügen zu lassen?

habe leider nichts bei google gefunden, delhi hilfe geht auf dieses problem nicht ein...


MfG Chiller


jaenicke - So 05.04.09 01:56

:shock: Ich habe gar nichts verstanden, auch beim zweiten und dritten Durchlesen nicht. Du solltest dir mal etwas mehr Mühe beim Schreiben geben.

Ich rate einmal, dass du jetzt die Länge des Strings oder den String selbst manuell in den Quelltext geschrieben hast, das aber mehrfach machen willst und nicht jedesmal alles kopieren willst?

Du musst schon bei PosEx hinter dem gefundenen ersten String anfangen zu suchen. Am besten pack das alles in eine extra Funktion, der du den Seitenquelltext und Start und Ende des gesuchten Strings übergibst.
In der Funktion hilft dir sicherlich die Funktion Length, die dir die Länge eines Strings zurückgibt.


Chiller - So 05.04.09 12:14

nein, das ist nicht das problem, ich habe einfach das einlesen der pos variable und c über a und b gesetzt und dann unten statt nur auf a auf a+c verwiesen, das funkioniert...

zu dem problem:



mein suchstring:


OSI=81035" ><img src="http://i.onvista.de/ic/orderbuch.gif" border="0" width="20" alt="orderbuch" class="vb" /></a></td><td class="s1"><span class="g">+0,67</span>&nbsp;</td><td class="s1"><span class="g">


das ist quasi a, hier soll er beginnen...doch nun habe ich die +0,67 mal rot eingefärbt, um die geht es...morgen werden die +0,67 sich verändert haben, und er wird diesen teilstring nicht finden, da er sich verändert hat, da die +0,67 nicht mehr die gleichen sind...und den teilstring kann ich auch nicht kürzen da er sonst das falsche findet!

wie sage ich delphi also dass er die stelle wo die +0,67 steht auslassen soll? mir fällt nichts ein außer die wiederum auslesen zu lassen, und dann in die teilstring variable einfügen zu lassen...was ich dann aber noch sehr sehr häufig machen müsste und das programm wieder verlangsamen würde...



MfG Chiller


jaenicke - So 05.04.09 12:17

Wenn du mehrere gleicher Strings finden willst, dann musst du eben von vorneherein PosEx benutzen. Dann kannst du einfach jeweils hinter deiner aktuellen Fundstelle fortsetzen.


Chiller - So 05.04.09 12:24

nein, das ist ja gar nicht das problem...

den suchstring wird er ab morgen nicht mehr finden, da sich die +0,67 verändert haben, deshalb wird er gar keine position finden, da der suchstring so nicht mehr existiert, sondern mit zb +0,75 anstatt +0,67...und jetzt weiß ich nicht wie ich delphi sagen soll dass es egal ist was an dieser stelle im suchstring steht!


MfG Chiller


jaenicke - So 05.04.09 12:29

Ach so, ich dachte diesen Wert willst du auslesen.

Ja, entweder nimmst du einen HTML-Parser oder du musst eben alle Fundstellen der umgebenden Strings durchsuchen, wenn die Strings vor und nach deinem gesuchten String sonst nicht eindeutig sind.