Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Probleme beim freigeben von mit getmem allocierten Speicher (https://www.delphipraxis.net/19526-probleme-beim-freigeben-von-mit-getmem-allocierten-speicher.html)

Blizzard 5. Apr 2004 07:49


Probleme beim freigeben von mit getmem allocierten Speicher
 
Hi,
ich bin grad dabei eine multithreading applikation zu schreiben bei der ich mittels postthreadmessage und peekmessage daten zwischen den threads hin und herschieben. mein problem ist jetzt das ich den speicher den ich mit getmem in thread a allociere und dann an thread b schicke in thread b mit freemem nicht mehr freigeben kann. Hier mal en code ausschnitt.

Code:
Const
 CMD_FORWARD = WM_USER+10;

Thread A
var
 puffer:PByte;
begin
while not terminated
...
 GetMem(puffer,receive.dwDataSize);
 ZeroMemory(puffer,receive.dwDataSize);
 copymemory(puffer,receive.Daten,receive.dwDataSize);
 PostThreadMessage(ThreadB.threadid,CMD_FOWARD,receive.dwDataSize,Cardinal(puffer));
...
end;

Thread B
var
 receive:PByte;
begin
while not terminated
...
 repeat
  PeekMessage(msg,0,WM_USER,WM_APP,PM_REMOVE);
 until (msg.message=CMD_FOWARD)or terminated;

 if terminated then exit;

 receive:=Pointer(msg.lParam);
...
 FreeMem(receive,msg.wParam);
end;
receive is ne datenstrukutr in der ich meine daten ablege.
der erste durchlauf in thread b funktioniert Problemlos. beim zweiten bekomm ich ne exception von wegen "ungültige Zeigeroperation". wobei getlasterror 0 ausgibt.

Jemand ne ahnung was ich falsch mache? kenn mich mit multithreading, messages und dynamischem speicher leider noch nicht so gut aus.

Thx
Blizzard

Luckie 5. Apr 2004 07:58

Re: Probleme beim freigeben von mit getmem allocierten Speic
 
Warum alloziierst du den Speicher immer neu in der Schleife? Alloziier ihn doch nur einmal und benutz in immer wieder. Oder ändert sich die benötigte Größe ständing? Wenn du ihn nur einmal alloziierst, vor der Schleife, kannst du ihn nach der Schleife im gleichen Thread wieder freigeben.

Ein andere Möglichkeit wäre die Threads kommunizieren zu lassen über globale Strukturen im Prozess. Da beide Threads auf den gesamten Adressraum des Prozesses zugriff haben kein Problem. Du musst die Zugriffe nur mit kritischen Abschnitten absichern.

Blizzard 5. Apr 2004 08:14

Re: Probleme beim freigeben von mit getmem allocierten Speic
 
ich allozier den speicher deswegen jedesmal neu, weil es sein kann das sich mehrere messages im queue von thread b ansammeln und ich mir sonst ja die daten überschreiben würde.
im durchschnitt ist thread b zwar einiges schneller als a aber manchmal postet a mehrere messages auf einmal die b nicht so schnell wegbekommt.

die thread über globale variabeln kommunizieren zu lassen hab ich am anfang gemacht. dann müsste ich die beiden threads aber synchronisieren was ich vermeiden will, da thread a daten von nem steuergerät holt und hierbei so schnell wie möglich sein sollte also im worst case ned auf thread b warten sollte.

Blizzard 7. Apr 2004 08:50

Re: Probleme beim freigeben von mit getmem allocierten Speic
 
ok hab das problem jetzt umgangen in dem ich auf die winapi genauer globalalloc,globallock, globalunlock und globalfree zurückgegriffen habe. damit gehts jetzt.
weis zwar immernochnicht warum das mit getmem ned wollte aber das is mit jetzt egal es läuft und das is das wichtigste


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:45 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