const
  Test = 'Test';begin
  if GlobalFindAtom(Test) = 0 then
  begin
    GlobalAddAtom(Test);    Application.Initialize;
    Application.MainFormOnTaskbar := True;
    Application.CreateForm(TForm, Form1);
    Application.Run;    GlobalDeleteAtom(GlobalFindAtom(Test));
  end;
end.
如果在程序运行期使用任务管理器结束进程,则在系统重启前一直不会再运行一个新的程序了,这个问题需要怎么解决呢?请大家帮忙看看,谢谢。

解决方案 »

  1.   

    使用任务管理器结束进程,会导致GlobalDeleteAtom(GlobalFindAtom(Test));没机会执行?改用CreateMutex呢?
      

  2.   

    对啊,任务管理器结束进程的话,这句GlobalDeleteAtom(GlobalFindAtom(Test));没机会执行了。也试过用CreateMutex,是可以的。
    现在只是想探究下使用全局原子有没有什么解决办法。实在不行也只好换用CreateMutex了。
      

  3.   

    Mutex的好处是它不属于任何线程时,自动释放
    所以,没机会释放,但只要进程关了,也就自动释放了
      

  4.   

    CreateMutex可以做到,我就是用这个CreateMutex的,别的也不知道。
      

  5.   

    內核對象都是有 引用計數的,全局原子也應該有。只是它創建完後,必須自己GlobalDeleteAtom。
    Mutex,即使擁有它的線程沒有releaseMutex,當此線程結束時,mutex引用計數自己減1.
      

  6.   

    他的意思就是说由于被TASK MANAGER杀掉导致GlobalDeleteAtom无法执行到
      

  7.   

    刚查了msdn,全局原子有区分 string atom 和 integer atom若是前者,则会产生并维护 引用计数;若是后者,则没有引用计数;所以有GlobalAddAtom也就必须有GlobalDeleteAtom。说这些,也就是让楼主了解事实,不必在这上面花时间了...