2016-10-13 15 views
3

私は、カスタムVCLスレッドのフォームにワーカースレッドからの情報を交換するためにカスタムウィンドウメッセージを使用しています。私はこれを行うメッセージで、いくつかのデータを送信する必要があるとき:受信フォームDelphiのポインタメモリとフリーズ

try 
    myStrP := PntStr(MSG.LParam); 
    myfunction(myStrP^); 
finally 
    Dispose(myStrP); 
end; 

type 
    PntStr = ^string; 

その後、のPostMessage()

var 
    pointString : PntStr; 

(...) 

New(pointString); 
pointString^ := mystring; 
PostMessage(frmDest.Handle, UM_THREADMSG, UM_MYEVENT1, LPARAM(pointString)); 

これは正しい方法ですポインタによって割り当てられたメモリを処理するには?電話をかけるDispose()がポインタ上でメモリを解放しますか?

答えて

7

はい、あなたのアプローチはメモリ管理に関して正しいです。 NewおよびDisposeは、管理対象タイプを正しく処理します。それは本当に彼らがすることです。

いくつかのニュアンス:

  • PostMessageの戻り値を確認してください。失敗した場合、メッセージはポストされず、スレッドはメモリを破棄する必要があります。
  • 受信者としてフォームのハンドルを使用しないでください。競合状態があります。フォームのウィンドウは、メッセージの投稿と同時に作成することができます。その後、メッセージは失われます。ハンドルが再利用された場合、別のウィンドウに配信されることがあります。または悪いことに、ウィンドウが間違ったスレッドで再作成される可能性があります。代わりにAllocateHWndを使用して、あなたがコントロールする人生のウィンドウハンドルを作成してください。
  • try/finallyが間違っています。 tryは、リソースを取得した後に表示されます。これは私たちがここで見ている最も一般的な間違いの一つです。あなたのコードでは、代入が例外を発生させることはできないが、それはまだ正確な価値があるので、無害である可能性が高い。
関連する問題