String via Sendmessage unvollständig
Hallo DP,
ich nutze auf meiner Hauptanwendung idHttp und sende POST requests an einen Server. Obwohl ich idAntiFreeze benutze, friert die Anwendung regelmäßig ein, ganz besonders wenn die Internetverbindung etwas langsamer ist. Dadurch sind die anderen Funktionen der Anwendung kaum nutzbar und deshalb möchte ich den POST request eine andere Applikation erledigen lassen. Dazu habe ich eine neue Formularanwendung erstellt, die
Die Hauptanwendung muss lediglich die URL an die Sekundäranwendung übermitteln, damit diese den POST request absetzen kann. Sobald ein Ergebnis vorliegt, meldet die Sekundäranwendung den Status an die Hauptanwendung. Mein Problem ist, dass der String per SendMessage nicht mehr als 6 Zeichen verträgt: Sender Code:
Delphi-Quellcode:
Empfänger Code:
procedure TForm1.Button1Click(Sender: TObject);
var DataStruct : CopyDataStruct; begin DataStruct.dwData := 0; DataStruct.cbData := length(Edit1.Text)+1; DataStruct.lpData := pchar(Edit1.Text); SendMessage(FindWindow('TForm1', 'Recipient'), WM_CopyData, Form1.handle, integer(@DataStruct)); end;
Delphi-Quellcode:
Leider sind die Ergebnisse alle unvollständig und es gibt unterschiedliche String-Längen. Hier ein paar Beispiele:
procedure CopyData(var Msg: TWMCopyData); message wm_CopyData;
: procedure TForm1.CopyData(var Msg: TWmCopyData); var sMsg: String; begin if IsIconic(Application.Handle) then Application.Restore; sMsg := PChar(Msg.CopyDataStruct.lpData); lbMsg.Caption := sMsg; end; String 1234567890 wird zu 123456 String Edit1 wird zu Edi String www.test.de wird zu www.te String Delphipraxis wird zu Delphip Habt ihr eine Ahnung warum das so ist? |
AW: String via Sendmessage unvollständig
The SendMessage returns an integer value assigned by the code that handled the WM_CopyData message.
http://delphi.about.com/od/windowssh...m_copydata.htm Ausserdem: PChar: PANSICHAR, PWIDECHAR...??? Info: http://michael-puff.de/Programmierun...COPYDATA.shtml |
AW: String via Sendmessage unvollständig
Probiert mal statt
Code:
DataStruct.cbData := length(Edit1.Text)+1;
Code:
Oder schau mal Hier
DataStruct.cbData := SizeOf(Edit1.Text)+1;
|
AW: String via Sendmessage unvollständig
Ich habe schon mal keine Ahnung, warum du das in einer Sekundäranwendung auslagerst.
Delphi-Quellcode:
ist Kindergarten. Dort wird nur ein
TIdAntiFreeze
Delphi-Quellcode:
ausgeführt, wenn ein Datenblock übertragen wurde. Darum verschlechtert sich auch das Verhalten bei einer langsamen Leitung.
Application.ProcessMessages
Lagere den Versand in einen Thread aus und alles wird schön. |
AW: String via Sendmessage unvollständig
Zwei voneinander unahängige VCL-Anwendungen lassen sich mit den jeweiligen Fremdkomponenten recht schnell zusammenklicken.
Danach schickt man von der einen Nachrichten an die andere, um die Andere fernzusteuern. Und von der Anderen schickt man Nachrichten zwecks Kontrolle zurück an die eine. Wenn und falls das problemlos klappt, ist man sehr glücklich über seine beiden kommunizierenden VCL-Anwendungen! Wie man aus den zwei VCL-Anwendungen nun nur noch eine mit Threads macht, sollte abhängig von der verwendeten Delphi-Version nicht ganz so trivial oder simpel sein, wenn die beiden VCL-Anwendungen bisher ihre Ausgaben auf dem Bildschirm darstellten. Der ferngesteuerten Anwendung ihre Bildschirmausgaben wegzunehmen, um sie in einen Thread auszulagern, dürfte nicht ganz so einfach werden. Insofern habe ich vollstes Verständnis für Sekundäranwendungen. Welchen Vorteil hätte eigentlich ein Hauptprogramm mit zusätzlichem Thread, wenn der Thread abschmiert gegenüber zwei Programmen, die miteinander kommunizieren? |
AW: String via Sendmessage unvollständig
Zitat:
Wenn schon paranoid, dann doch auch bitte konsequent und die Sekundäranwendung auf einem separaten Rechner (im klimageregelten Tresor) laufen lassen. Der Austausch der Daten dann per MSMQ/ActiveMQ (transaktionsbasiert) damit auch ja nichts verloren gehen kann. Und dann noch die Reset-Taste des Rechners mit der Sekundäranwendung an das Netzwerk(*) anschliessen - man kann ja nie sicher sein, dass der sich nicht festfrisst. Gut, man fragt eigentlich nur ein paar Daten von einem Webserver ab ... also etwas, das jeden Tag von Millionen von Menschen mit einem Rechner und einer Anwendung tausendfach passiert ... aber man kann ja nicht vorsichtig (paranoid) genug sein ... :mrgreen: (*) Um diesen Reset-Taster per Netzwerk anzusprechen, reicht ein simpler HTTP-Request aus ... ;) |
AW: String via Sendmessage unvollständig
Wenn der Server nicht erreichbar ist, dann bekommt man eine Exception und gut ist.
Davon schmiert weder die Anwendung noch der Thread ab. Die Exception geht einfach ihren kontrollierten Weg, den man auch noch beeinflussen kann. |
AW: String via Sendmessage unvollständig
Bitte unterlasst es eure persönlichen Abneigungen hier öffentlich auszutragen.
Davon abgesehen halte ich einen zweiten Prozess für einen HTML Request auch für Overkill und unsinnig. Genau dafür sind Threads da, um Aufgaben im Hintergrund zu erledigen. Ein zweiter Prozess geht natürlich auch, aber da gestaltet sich die Interprozesskommunikation doch schon erheblich schwieriger. Ist der erste Prozess noch da? Kann er meine Nachricht empfangen oder ist er beschäftigt? Wie übermittele ich komplexe Daten? Bei einem Thread liegt alles im gleichen Prozessraum und ist einfach erreichbar. Und der "Auftraggeber" bestimmt wie was läuft. |
AW: String via Sendmessage unvollständig
Ich habe hier die Antworten, die mich sprachlos machten, entfernt.
Das Grundproblem ist ja, dass die Anwendung einfriert, wenn die Daten zu langsam kommen. Die fachlich gängige Lösung sind hier nunmal Threads. Zitat:
|
AW: String via Sendmessage unvollständig
Ernsthaft? So viele Antworten und noch keiner konnte eine richtige und klare Antwort auf das hier zustande bringen? :roll:
Das Problem ist, dass in XE6 (genauer: Ab Delphi 2009) die Chars in deinen Strings 2 Byte groß sind und DataStruct.cbData die Anzahl der zu sendenden Bytes möchte und nicht die Anzahl der Zeichen. Von daher:
Delphi-Quellcode:
DataStruct.cbData := Length(Edit1.Text)*SizeOf(Char);
Darum werden deine Strings auch ziemlich genau ab der Hälfte abgeschnitten. Zitat:
|
AW: String via Sendmessage unvollständig
Hallo DP,
:| ein Foren-thread voller Emotionen... ich hoffe ich habe mti meinem Beitrag niemanden provoziert. Bezüglich der Kernfrage, wieso der übermittelte String abgeschnitten wird wurde ich auf die richtige Spur gebracht: Folgender code übertragt den String korrekt: Sender:
Delphi-Quellcode:
Empfänger:
DataStruct.cbData := 1 + (Length(Fmain.edit4.Text) * SizeOf(Char));
DataStruct.lpData := PWideChar(Fmain.edit4.Text);
Delphi-Quellcode:
sMsg := PWideChar(Msg.CopyDataStruct.lpData);
Natürlich wären threads die klar bessere Lösung. Ich habe auch zuerst versucht, eine thread-basierte Lösung zu schreiben. Allerdings muss ich zugeben, dass das über meinem aktuellen (Delphi) Know-How ist. Es gibt unzählige Beitrage und Beispiele zu diesem Thema, aber ich konnte bisher keinen funktionierenden Code zustande bringen der einen POST request thread basiert absetzt. |
AW: String via Sendmessage unvollständig
Inter-process communication (IPC)
In computing, Inter-process communication (IPC) is a set of techniques for the exchange of data among multiple threads in one or more processes. Processes may be running on one or more computers connected by a network. IPC techniques are divided into methods for message passing, synchronization, shared memory, and remote procedure calls (RPC). The method of IPC used may vary based on the bandwidth and latency of communication between the threads, and the type of data being communicated. http://www.delphibasics.info/home/de...scommunication . IPC Description Source Code: Source of program show how to create a component for communication between processes. Allows the exchange of information between the 32 and 64 bit processes, services, and isolated process (Low Level Integrity). http://4coder.org/delphi-source-code/1009/ |
AW: String via Sendmessage unvollständig
Zitat:
Ich mache es über eine Callback.. da benötige ich keine Threads. gruss |
AW: String via Sendmessage unvollständig
Zitat:
|
AW: String via Sendmessage unvollständig
Zitat:
Eines der im ersten Beitrag genannten Probleme war eben das Einfrieren der Anwendung, wenn das Internet mal wieder ein wenig braucht. Und da hilft allein ein Callback ja auch nicht, solange der bremsende Request im Main-Thread läuft. |
AW: String via Sendmessage unvollständig
Zitat:
Zitat:
Deshalb habe ich auch meine Herangehensweise mitgeteilt. Aber gut wie du sagst jeder wie er will. gruss |
AW: String via Sendmessage unvollständig
Aber es würde mich interessieren, wie Du das Einfrieren des Main-Threads verhinderst (sei es in Rom oder Rio).
|
AW: String via Sendmessage unvollständig
Zitat:
das Problem der String Übertragung wurde wie gesagt gelöst, wobei das Einfrieren auch die Sekundäranwendung betrifft im Fall von SendMessage. Dieser Artikel war dabei sehr hilfreich: Windows Messages Tutorial Ich habe mir das IPC Beispiel mal angesehen und es würde all meine Probleme lösen, ich habe nur Schwierigkeiten es komplett zu verstehen. Ich bin euch für eure Unterstützung sehr dankbar! Habt alle ein schönes Wochenende! |
AW: String via Sendmessage unvollständig
Zitat:
Das ordentlich hinzugekommen ist aber nicht wirklich einfacher als Threads zu benutzen :wink: |
AW: String via Sendmessage unvollständig
Statt eines Autos kann man auch eine Porsche nehmen. :mrgreen:
|
AW: String via Sendmessage unvollständig
Aber ist ein HTTP-Request, der z.B. 2 oder 3 Sekunden lang braucht, nicht ein Monolith?
|
AW: String via Sendmessage unvollständig
Nonblocking/overlapping/asynchrone Socket-Operationen sind die Lösung. Wie genau das mit der WinAPI geht, habe ich noch nicht ganz durchschaut*; aber die Socket-Doku macht deutlich dass das unterstützt wird.
Im Prinzip würde man immer das in einen Puffer lesen was gerade da ist und dann später noch mal nachgucken (Busy Waiting, vielleicht kann man sich das auch irgendwie signalisieren lassen). * zu viel Arbeit nur für den Spaß, wenn man sonst mit *nix arbeitet |
AW: String via Sendmessage unvollständig
Okay - technisch geht's aber es macht - aus meiner Sicht - deutlich, warum sich viele Entwickler da lieber an Threads halten. :mrgreen:
|
AW: String via Sendmessage unvollständig
Liste der Anhänge anzeigen (Anzahl: 4)
Zitat:
Im Anhang das erweiterte IPC-Beispiel: |
AW: String via Sendmessage unvollständig
Hi DP,
ich war im Urlaub und antworte deshalb so spät. Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:29 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