procedure TRegMonitorThread.Execute;
begin
  // 创建一个没有命名的事件对象,并返回该对象的句柄
  FEvent := CreateEvent(nil, True, False, 'RegMonitorChange');
  // 监视注册表里的变化,如有变化则让FEvent变成有信号
  // 他是不是一直处于监视状态
  RegNotifyChangeKeyValue(FReg.CurrentKey, 1, Filter, FEvent, 1);
  // 检测进程是不是结束,如没结束则运行以下代码
  while not Terminated do
    // 检测Fevent是不是有信号.如果有,则运行以下代码
    if WaitForSingleObject(FEvent, INFINITE) = WAIT_OBJECT_0 then
    begin
      FChangeData.RootKey := RootKey;
      FChangeData.Key := Key;
      SendMessage(Wnd, WM_REGCHANGE, RootKey, Longint(PChar(Key)));
      ResetEvent(FEvent);
      // 如果上面的那个一直处于监视状态,那这个是不是多余的
      RegNotifyChangeKeyValue(FReg.CurrentKey, 1, Filter, FEvent, 1);
    end;
end;
帮我看看我的注释是不是对的.如果不对,请指出.谢谢!

解决方案 »

  1.   

    // 创建一个没有命名的事件对象,并返回该对象的句柄
      FEvent := CreateEvent(nil, True, False, 'RegMonitorChange');
    貌似这个事件你命名了吧..
      

  2.   

    procedure TRegMonitorThread.Execute;
    begin
      FEvent := CreateEvent(nil, True, False, nil);
      while not Terminated do
        RegNotifyChangeKeyValue(FReg.CurrentKey, 1, Filter, FEvent, 1);
        if WaitForSingleObject(FEvent, INFINITE) = WAIT_OBJECT_0 then
        begin
          FChangeData.RootKey := RootKey;
          FChangeData.Key := Key;
          SendMessage(Wnd, WM_REGCHANGE, RootKey, Longint(PChar(Key)));
          ResetEvent(FEvent);
        end;
    end;我把上面的代码改成了这样改了二个东西:
    1.把 FEvent := CreateEvent(nil, True, False, 'RegMonitorChange');后面创建的一个事件对像改成了nil
    2.把RegNotifyChangeKeyValue移到了not Terminated的里面。把下面的一个RegNotifyChangeKeyValue给删了这里面我有二个问题:
    1.就是createevent这个函数里面的创建一个事件对像名,我改成了nil。我想知道这个对像名到底有什么用。
    2.改成这样是对还是错。
      

  3.   

    这个名字是全局的.相对于OS.
    如果这个名字的Event对象已经存在,你用CreateEvent创建事件对象的时候,等于用OpenEvent打开了一个已存在的事件对象.
    单独的进程使用.用nil就可以了。没有必要命名