AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Windows message queue - Limit erreicht?

Windows message queue - Limit erreicht?

Ein Thema von moelski · begonnen am 8. Dez 2010 · letzter Beitrag vom 8. Dez 2010
Antwort Antwort
Seite 1 von 3  1 23   
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#1

Windows message queue - Limit erreicht?

  Alt 8. Dez 2010, 19:05
Moin !

Wir haben einen USB Logger den wir auslesen. Dieser Logger sendet nach einem Kommando einen Block an Daten (~40.000 Telegramme á 57 Byte).
Also komponente verwenden wir NrComm (HID) - aber das spielt hier eh keine wichtige Rolle.

Die Daten werdenfolgendermassen empfangen:
Delphi-Quellcode:
procedure TForm1.HidAfterReceive(Com: TObject; Buffer: Pointer;
  Received: Cardinal);
var ByteData : AnsiString;
    i : integer;
    _msg : PHIDFeedback;
begin
  Inc(HidCount);

  for i := 0 to Received - 1
    do ByteData := ByteData + PAnsiChar(Buffer)[i];

  New(_msg);
  _msg.Data := ByteData;
  _msg.HidCount := HidCount;
  PostMessage(self.Handle, WM_MY_HID_DATA, 0, Integer(_msg)); // Daten übergeben
end;
Und so ausgewertet:
Delphi-Quellcode:
procedure TForm1.DecodeHID(var Msg: TMessage);
var _msg : PHIDFeedback;
begin
  _msg := nil;
  try
    _msg := PHIDFeedback(Msg.LParam);

    // hier passiert noch mehr ...

    memo1.Lines.Add('[' + IntToStr(_Msg.HidCount) + '] ' + string(_msg.Hex));
  finally
    Dispose(_msg); // Pointer löschen
  end;
end;
Wir nutzen also Windows Messages um die Daten aus dem Empfangsthread in den Mainthread zur Auswertung zu bekommen.

Diese Technik hat bis dato immer super funktioniert. Aber nun ergeben sich mit einem neuen Logger Probleme.
Wenn die Zahl der Telegramme zu gross wird (so ab > 30.000) dann gehen teilweise Telegramme verloren.

Gibt es bei den windows Messages irgendwelche Grenzen die man nicht überschreiten darf? Hat die queue nur eine bestimmte maximale Länge?
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010

Geändert von moelski ( 8. Dez 2010 um 19:09 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#2

AW: Windows message queue - Limit erreicht?

  Alt 8. Dez 2010, 19:24
Ich zitiere mal aus dem MSDN:
Zitat:
There is a limit of 10,000 posted messages per message queue. This limit should be sufficiently large. If your application exceeds the limit, it should be redesigned to avoid consuming so many system resources. To adjust this limit, modify the following registry key.

HKEY_LOCAL_MACHINE
SOFTWARE
Microsoft
Windows NT
CurrentVersion
Windows
USERPostMessageLimit

The minimum acceptable value is 4000.
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx

Frage erledigt?
  Mit Zitat antworten Zitat
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#3

AW: Windows message queue - Limit erreicht?

  Alt 8. Dez 2010, 19:26
Ja Frage erledigt ...
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.114 Beiträge
 
Delphi 12 Athens
 
#4

AW: Windows message queue - Limit erreicht?

  Alt 8. Dez 2010, 19:29
Ein Blick in MSDN-Library durchsuchenPostMessage sagt alles:
Zitat:
There is a limit of 10,000 posted messages per message queue. This limit should be sufficiently large. If your application exceeds the limit, it should be redesigned to avoid consuming so many system resources. To adjust this limit, modify the following registry key.

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\USERPostMessageLimit
Aber eh ich an windowsglobalen Einstellungen rumspiele, würde ich eher das Programmkonzept überdenken.

[edit]
da hat wer schneller geantwortet, als meine Leitung senden wollte


[add]
zu der For-Schleife sag ich mal Aua
Delphi-Quellcode:
procedure TForm1.HidAfterReceive(Com: TObject; Buffer: Pointer;
  Received: Cardinal);
var ByteData : AnsiString;
    i : integer;
    _msg : PHIDFeedback;
begin
  Inc(HidCount);
  New(_msg);
  SetLength(_msg.Data, Received);
  MoveMemory(@msg.Data[0], Buffer, Received);
  _msg.HidCount := HidCount;
  PostMessage(self.Handle, WM_MY_HID_DATA, 0, Integer(_msg));
end;
PS: Wenn du/ihr noch etwas Zeit habt:
http://www.delphipraxis.net/156006-n...omponente.html
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 8. Dez 2010 um 19:35 Uhr)
  Mit Zitat antworten Zitat
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#5

AW: Windows message queue - Limit erreicht?

  Alt 8. Dez 2010, 19:39
Moin !

Zitat:
zu der For-Schleife sag ich mal Aua
Is ja gut ...
Aber das ist im Moment das kleinste Problem.

Hast du nicht einen Tip wie ich die Daten vom Empfangsthread Resourcen schonender zum Mainthread bekomme ?
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

AW: Windows message queue - Limit erreicht?

  Alt 8. Dez 2010, 19:40
Der Speicher von _msg wird nicht wieder freigegeben.
Delphi-Quellcode:
 New(_msg);
  _msg.Data := ByteData;
  _msg.HidCount := HidCount;
  PostMessage(self.Handle, WM_MY_HID_DATA, 0, Integer(_msg)); // Daten übergeben
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#7

AW: Windows message queue - Limit erreicht?

  Alt 8. Dez 2010, 19:42
Moin !

Zitat:
Der Speicher von _msg wird nicht wieder freigegeben.
Sollte doch in DecodeHID mittels Dispose(_msg) erfolgen ?
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#8

AW: Windows message queue - Limit erreicht?

  Alt 8. Dez 2010, 19:55
Lokale Variablen verlieren ihre Gültigkeit beim Verlassen der Routine. _msg aus HidAfterReceive ist in Decode-Dingsbums unbekannt. Zu mal du in Decode-Dingsbums _msg auch deklariert hast. Das sind zwei unterschiedliche Variablen, auch wenn sie gleich heißen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.114 Beiträge
 
Delphi 12 Athens
 
#9

AW: Windows message queue - Limit erreicht?

  Alt 8. Dez 2010, 20:02
Du könntest ja auf eine andere/größere Queue/Liste ausweichen?

Delphi-Quellcode:
uses SyncObjs, Generics.Collections;

var
  QueueCS: TCriticalSection;
  Queue: TQueue<THIDFeedback>;


var
  Temp: THIDFeedback;
begin
  // hid-thread
  SetLength(Temp.Data, Received);
  MoveMemory(@Temp.Data[0], Buffer, Received);
  Temp.HidCount := HidCount;
  QueueCS.Enter;
  try
    Queue.Enqueue(Temp);
  finally
    QueueCS.Leave;
  end;


  // mainthread
  QueueCS.Enter;
  try
    Found := Queue.Count > 0;
    if Found then Temp := Queue.Dequeue;
  finally
    QueueCS.Leave;
  end;
  if Found then
  begin
    // temp auswerten
  end;
Statt Record, CS und gen. Queue könnte man auch TThreadList mit Objekten nutzen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Basilikum

Registriert seit: 9. Aug 2003
389 Beiträge
 
Delphi 7 Professional
 
#10

AW: Windows message queue - Limit erreicht?

  Alt 8. Dez 2010, 20:04
Lokale Variablen verlieren ihre Gültigkeit beim Verlassen der Routine. _msg aus HidAfterReceive ist in Decode-Dingsbums unbekannt. Zu mal du in Decode-Dingsbums _msg auch deklariert hast. Das sind zwei unterschiedliche Variablen, auch wenn sie gleich heißen.
Oberflächlich betrachtet ist diese Aussage natürlich korrekt - aber wenn man es genauer anschauen würde, würde man erkennen, dass zwischen den beiden Funktionen die erwähnte Windows-Message-Queue steckt, welche den Pointer auf den vermeindlich nicht freigegebenen Speicher an die Funktion überliefert, welche den Speicher dann korrekt freigibt - das Speicher-Handling ist korrekt...
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23   

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 02:35 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