使用全局原子运行让程序之运行一个的问题

iqyely 2010-03-18 04:02:11

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.


如果在程序运行期使用任务管理器结束进程,则在系统重启前一直不会再运行一个新的程序了,这个问题需要怎么解决呢?请大家帮忙看看,谢谢。
...全文
139 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
iqyely 2010-03-18
  • 打赏
  • 举报
回复
恩,谢谢各位热心的解答。
金卯刀 2010-03-18
  • 打赏
  • 举报
回复
刚查了msdn,全局原子有区分 string atom 和 integer atom

若是前者,则会产生并维护 引用计数;若是后者,则没有引用计数;

所以有GlobalAddAtom也就必须有GlobalDeleteAtom。

说这些,也就是让楼主了解事实,不必在这上面花时间了...
Harryfin 2010-03-18
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 avan_lau 的回复:]

內核對象都是有 引用計數的,全局原子也應該有。只是它創建完後,必須自己GlobalDeleteAtom。
Mutex,即使擁有它的線程沒有releaseMutex,當此線程結束時,mutex引用計數自己減1.
[/Quote]
他的意思就是说由于被TASK MANAGER杀掉导致GlobalDeleteAtom无法执行到
金卯刀 2010-03-18
  • 打赏
  • 举报
回复
內核對象都是有 引用計數的,全局原子也應該有。只是它創建完後,必須自己GlobalDeleteAtom。
Mutex,即使擁有它的線程沒有releaseMutex,當此線程結束時,mutex引用計數自己減1.
SQLDebug_Fan 2010-03-18
  • 打赏
  • 举报
回复
CreateMutex可以做到,我就是用这个CreateMutex的,别的也不知道。
kfcoffe 2010-03-18
  • 打赏
  • 举报
回复
mark
haitao 2010-03-18
  • 打赏
  • 举报
回复
Mutex的好处是它不属于任何线程时,自动释放
所以,没机会释放,但只要进程关了,也就自动释放了
iqyely 2010-03-18
  • 打赏
  • 举报
回复
对啊,任务管理器结束进程的话,这句GlobalDeleteAtom(GlobalFindAtom(Test));没机会执行了。

也试过用CreateMutex,是可以的。
现在只是想探究下使用全局原子有没有什么解决办法。实在不行也只好换用CreateMutex了。
haitao 2010-03-18
  • 打赏
  • 举报
回复
使用任务管理器结束进程,会导致GlobalDeleteAtom(GlobalFindAtom(Test));没机会执行?

改用CreateMutex呢?

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧