AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Fehler nach Umstellung auf PostMessage

Fehler nach Umstellung auf PostMessage

Ein Thema von yogie · begonnen am 30. Jun 2016 · letzter Beitrag vom 1. Jul 2016
Antwort Antwort
Seite 1 von 2  1 2   
yogie

Registriert seit: 11. Sep 2003
Ort: bei Goslar
213 Beiträge
 
Delphi 6 Professional
 
#1

Fehler nach Umstellung auf PostMessage

  Alt 30. Jun 2016, 07:50
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:
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;
Eigentlich bin ich der Meinung, das Dispose sollte den mit New angeforderten
Speicher wieder freigeben. Kann es an einer Segmentierung liegen?
Kompatibilität ist ein Euphemismus für n i c h t einhunderprozentige Austauschbarkeit
http://b-und-l-service.de/

Geändert von yogie (30. Jun 2016 um 08:02 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#2

AW: Fehler nach Umstellung auf PostMessage

  Alt 30. Jun 2016, 08:29
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:
Speicher wieder freigeben.
Wenn du nicht warten kannst auf das was du in den Speicher schreibst.
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

Geändert von EWeiss (30. Jun 2016 um 08:55 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
8.951 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Fehler nach Umstellung auf PostMessage

  Alt 30. Jun 2016, 09:18
Zitat:
Speicher wieder freigeben.
Wenn du nicht warten kannst auf das was du in den Speicher schreibst.
Wie willst du es dann wieder freigeben.
Wenn ich das richtig verstanden habe, gibt der Empfänger der Nachricht OnRX_Msg 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.

Ich muss aber gestehen, daß ich mit Delphi 6 nicht mehr so auf dem Laufenden bin.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#4

AW: Fehler nach Umstellung auf PostMessage

  Alt 30. Jun 2016, 09:26
Zitat:
Speicher wieder freigeben.
Wenn du nicht warten kannst auf das was du in den Speicher schreibst.
Wie willst du es dann wieder freigeben.
Wenn ich das richtig verstanden habe, gibt der Empfänger der Nachricht OnRX_Msg 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.
https://msdn.microsoft.com/de-de/library/bb979347.aspx

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:
Ich muss aber gestehen, daß ich mit Delphi 6 nicht mehr so auf dem Laufenden bin.
Egal welcher Delphi Version man unterliegt ist bei allen das gleiche.

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

Geändert von EWeiss (30. Jun 2016 um 09:50 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
8.951 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Fehler nach Umstellung auf PostMessage

  Alt 30. Jun 2016, 10:05
Auf der anderen Seite sehe ich das er seinem Thread ein Property RX_Msg spendiert hat.
Einen Thread sehe ich da überhaupt nicht. Anhand der Klassennamen TFrmXXX vermute ich ganz simple TForm-Instanzen. Die serielle Schnittstelle hat mit dem Problem offenbar auch gar nichts zu tun, da hier lediglich ein String über eine Message von einem Form zum anderen transportiert werden soll. Wie auch immer die Daten vom COM-Port empfangen werden, ist hier weder ersichtlich noch relevant.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
yogie

Registriert seit: 11. Sep 2003
Ort: bei Goslar
213 Beiträge
 
Delphi 6 Professional
 
#6

AW: Fehler nach Umstellung auf PostMessage

  Alt 30. Jun 2016, 10:12
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!
Kompatibilität ist ein Euphemismus für n i c h t einhunderprozentige Austauschbarkeit
http://b-und-l-service.de/
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#7

AW: Fehler nach Umstellung auf PostMessage

  Alt 30. Jun 2016, 10:19
Zitat:
Einen Thread sehe ich da überhaupt nicht.
Muss man das?
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

Geändert von EWeiss (30. Jun 2016 um 10:28 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#8

AW: Fehler nach Umstellung auf PostMessage

  Alt 30. Jun 2016, 11:01
Ich könnte mir so etwas vorstellen:
Delphi-Quellcode:
for i:=0 to ganzviel do
  Machwas;
  postmessage();
  application.processmessages;
end;

procedure tform.MyMsg();
begin
 ..
end;
Wenn das vernünftig läuft, lagerst Du den Inhalt der For-Schleife in einen Thread aus.
So als Idee..

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
8.951 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Fehler nach Umstellung auf PostMessage

  Alt 30. Jun 2016, 12:28
Wenn das vernünftig läuft, lagerst Du den Inhalt der For-Schleife in einen Thread aus.
Application.ProcessMessages in einem Thread? Na dann viel Spaß!
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#10

AW: Fehler nach Umstellung auf PostMessage

  Alt 30. Jun 2016, 14:22
das hier kann man löschen. Hab da was missverstanden

gruss

Geändert von EWeiss (30. Jun 2016 um 14:24 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:58 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf