![]() |
Fehler nach Umstellung auf PostMessage
Hallo Zusammen.
In einer größeren Anwendung habe ich vor einiger Zeit die Übergabe von Strings von einer Unit zu einer anderen Unit von globalen Variablen auf PostMessage umgestellt. Die Daten stammen von einer seriellen Schnittstelle und sind Strings mit ca. 100 Byte Länge. In meinem Hauptfenster werden die Daten empfangen und verarbeitet. Nun bekomme ich bei genügend langer Laufzeit, (d.h. ca. 20000 Übertragungen) die Fehlermeldung "Nicht genug Arbeitsspeicher". Ich habe schon mit diesem Stichwort gesucht und verschiedene Hinweise gefunden. Hat jemand noch einen Tip wie man weiter vorgehen könnte? PC ist ein AMD Athlon 64 (2,4 GJz) mit 2 Gbyte Speicher. Ich verwende Delphi 6. Hier folgen die beiden relevanten Ausschnitte aus meinem Programm:
Delphi-Quellcode:
Eigentlich bin ich der Meinung, das Dispose sollte den mit New angeforderten
procedure TfrmSerial.PostRX_Msg(Msg : shortstring);
var pMsgStr : PShortString; begin New(pMsgStr); pMsgStr^ := Msg; {FormForPostMessage.Handle und die Konstante RX_Msg werden beim Start gesetzt u. ändern sich nicht} PostMessage(FormForPostMessage.Handle, RX_Msg, Integer(pMsgStr), 0); end; procedure TFrmMain.OnRX_Msg( var M : TMessage); var pMsg : PShortString; myStr : string; begin pMsg := Ptr(M.wparam); myStr := pMsg^; {...Verarbeitung von myStr...} Dispose(pMsg); end; Speicher wieder freigeben. Kann es an einer Segmentierung liegen? |
AW: Fehler nach Umstellung auf PostMessage
Dir ist aber schon klar das bei PostMessage nicht gewartet wird?
Du weist also im Normalfall nicht ob das senden des Strings auch erfolgreich war. Zitat:
Wie willst du es dann wieder freigeben. Der Buffer der Seriellen Schnittstelle hat nun mal nur einen begrenzten Platz. Versuch es mal mit Sendmessage. gruss |
AW: Fehler nach Umstellung auf PostMessage
Zitat:
Delphi-Quellcode:
den Speicher wieder frei. Es bleibt natürlich noch nachzuweisen, daß auch wirklich alle mit PostMessage verschickten Nachrichten in dem besagten Event ankommen. Allerdings würde ich erwarten, daß das schon vorher aufgefallen wäre.
OnRX_Msg
Ich muss aber gestehen, daß ich mit Delphi 6 nicht mehr so auf dem Laufenden bin. |
AW: Fehler nach Umstellung auf PostMessage
Zitat:
![]() Beim arbeiten mit der Seriellen Schnittstelle würde ich meine Daten nicht in einer Warteschlange hinterlegen sondern diese Direkt verarbeiten. Der Buffer der Schnittstelle hat nur einen Begrenzten Speicher irgendwann läuft dieser über (ist nichts mehr frei) Zudem reserviert er Speicher versucht diesen zu löschen obwohl er gar nicht weis ob die Daten auch verarbeitet wurden. Zitat:
EDIT: Auf der anderen Seite sehe ich das er seinem Thread ein Property RX_Msg spendiert hat. Diese sollte nach dem Empfang OnRX_Msg anspringen welche dann den allokierten Speicher wieder freigibt. Die Frage wäre dann nur noch ob der Pointer dann noch gültig ist oder die Botschaft Schlange nicht schon voll ist. gruss |
AW: Fehler nach Umstellung auf PostMessage
Zitat:
|
AW: Fehler nach Umstellung auf PostMessage
Erstmal danke für die Antworten.
Die serielle Schnittstelle ist nicht das Problem. Die läuft gut und ist seit Jahren unverändert. (AsyncPro) Es sollen tatsächlich nur Daten von einer Form zur anderen übertragen werden. Ich habe mal probeweise auf SendMessage umgestellt und werde das testen. Bei der Gelegnheit ist mir aber eine andere Stelle im Programm aufgefallen, die zusammen mit dieser Umstellung geändert wurde. Ich befürchte ich habe an der falsche Stelle gesucht. Da wird auch mit PostMessage gearbeitet. Ich habe dort eine rudimentäre Form des Obsever-Pattern gebaut. Dort scheint mir die Freigabe von Speicher nicht sauber zu sein. Trotzdem nochmal Danke! |
AW: Fehler nach Umstellung auf PostMessage
Zitat:
Sollte Voraussetzung sein wenn man schon mit Postmessage Arbeitet zumindest unter Win32_API. Wie soll ich sonst in der message Queue die Msg...RX_Msg verarbeiten. Aber ok er scheint ja die Lösung gefunden zu haben. Letztendlich kann man an Hand der 3 Zeilen Code auch nur raten. Warum auch immer Postmessage, einen Vorteil bsp. "Schnelligkeit" sehe ich da keinen. gruss |
AW: Fehler nach Umstellung auf PostMessage
Ich könnte mir so etwas vorstellen:
Delphi-Quellcode:
Wenn das vernünftig läuft, lagerst Du den Inhalt der For-Schleife in einen Thread aus.
for i:=0 to ganzviel do
Machwas; postmessage(); application.processmessages; end; procedure tform.MyMsg(); begin .. end; So als Idee.. Gruß K-H |
AW: Fehler nach Umstellung auf PostMessage
Zitat:
|
AW: Fehler nach Umstellung auf PostMessage
das hier kann man löschen. Hab da was missverstanden
gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:24 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