TOPページへ戻る  PCページへ戻る  TreeView一覧へ戻る

AutoRefresh有効時のメモリリークの修正

TShellTreeViewにはAutoRefreshプロパティがあります。AutoRefreshプロパティをTrueにすると、 新規にフォルダが作成/消去/名前変更された際にそれを即座に反映してくれます。しかし、AutoRefreshを有効にすると メモリリークが発生します。

この原因はTShellChangeThreadにあります。TShellChangeThreadはTShellChangeNotifierで使用され、 TShellChangeNotifierはTShellTreeViewで使用されています。このTShellChangeThreadでは、フォルダの変更を関知した 際にSetDirectoryOptions手続きを呼び出し、そこで監視用ハンドル(FWaitHandle)を一端終了します。その際に、 Create手続きで作成したMutexを破棄し忘れているためです。

ShellCtrls.pasを開き、 TShellChangeThread.SetDirectoryOptions手続きに下のように2行追加することでメモリリークが無くなります。


procedure TShellChangeThread.SetDirectoryOptions(Directory: String;  
                                                 WatchSubTree: Boolean; 
                                                 NotifyOptionFlags: DWORD);
begin
  EnterCriticalSection(CS);
  FDirectory := Directory;
  FWatchSubTree := WatchSubTree;
  FNotifyOptionFlags := NotifyOptionFlags;

  // Release the current notification handle
  FindCloseChangeNotification(FWaitHandle);

  CloseHandle(FMutex);					// 古いMutexを破棄
  FMutex := CreateMutex(nil, True, nil);		// 新しいMutexを作成

  FWaitChanged := true;
  LeaveCriticalSection(CS);
end;

TOPページへ戻る  PCページへ戻る  TreeView一覧へ戻る