| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1094 人关注过本帖, 2 人收藏
标题:关于避免EXE重复运行的问题
取消只看楼主 加入收藏
laowan001
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:66
帖 子:1069
专家分:2613
注 册:2015-12-30
结帖率:100%
收藏(2)
已结贴  问题点数:20 回复次数:9 
关于避免EXE重复运行的问题
程序代码:
DECLARE integer FindWindow  in   win32api   string   cClass,String   cCaption
if FindWindow(0,thisform.Caption)#0
    messagebox('本EXE已经运行')
endif

FindWindow(0,thisform.Caption)=0时,exe没有运行,如果大于0则表示已经运行
说明:执行的是编译后的EXE程序
问题:如果运行了程序,则FindWindow(0,thisform.Caption)非0,此时无法判断是否重复运行
解决办法:在setting.ini里写一个值,表示程序已经运行,程序退出时将这个值写为空,当再次运行时,判断这个值,如果是空则表示首次运行,否则就是重复运行
带来的问题:如果程序非正常退出,如断电、死机等,没能将那个值写为空,则以后再进入的时候则会判断为已经运行,至此卡住了

各位有什么好方法

搜索更多相关主题的帖子: 重复运行 FindWindow EXE 运行 判断 
2023-10-10 09:05
laowan001
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:66
帖 子:1069
专家分:2613
注 册:2015-12-30
收藏
得分:0 
以下是引用星光悠蓝在2023-10-10 10:16:07的发言:

用两个值来记录,一个记录是否运行,另一个记录是否正常退出,下次如果检测为非正常退出,则可正常运行。

“是否正常退出”,这个值只能在正常退出情况下能更新,非正常退出时没机会更新
“是否运行”也是同样的情况
好像还是没法明确判断
2023-10-10 10:40
laowan001
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:66
帖 子:1069
专家分:2613
注 册:2015-12-30
收藏
得分:0 
以下是引用csyx在2023-10-10 10:21:33的发言:

用 api 创建互斥量、信号灯、内存映射文件 ...,这其中任意一种方法都要可靠的多

这些方法我都不会
2023-10-10 10:41
laowan001
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:66
帖 子:1069
专家分:2613
注 册:2015-12-30
收藏
得分:0 
以下是引用abcde007在2023-10-10 10:53:16的发言:




“非正常退出时没机会更新”,非正常退出这时候不需要更新啊。该数值没有更新恰恰说明是“非正常退出”吧。
“是否运行”也是一样的。

有道理!!!!!看来我是左脚绊右脚了
好像记录一个值就够了,我试下

[此贴子已经被作者于2023-10-10 11:48编辑过]

2023-10-10 11:46
laowan001
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:66
帖 子:1069
专家分:2613
注 册:2015-12-30
收藏
得分:0 
回复 8楼 kangss
方法可行,多谢多谢
2023-10-10 15:22
laowan001
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:66
帖 子:1069
专家分:2613
注 册:2015-12-30
收藏
得分:0 
以下是引用kangss在2023-10-10 11:04:06的发言:

禁止程序重复运行的又一方法
DECLARE integer CreateEventA IN WIN32API integer,long,long,string
DECLARE integer OpenEventA IN WIN32API integer,long,string
IF OpenEventA(2031619, .F.,myappname)0 &&myappname可以是任意文本,最好要长一点。
    =MESSAGEBOX("程序已经在运行,不要浪费资源呵!", 48, "信息提示")
    RETURN .F.
ELSE
    CreateEventA(0, .F., .F.,myappname)
ENDIF

测试未成功,代码中的myappname换成exe文件名(如:aaa.exe),同时两次运行同一exe,OpenEventA(2031619, .F.,myappname)的值均为0,不知我的操作是否正确
其中的2031619是固定值吧?

[此贴子已经被作者于2023-10-10 15:26编辑过]

2023-10-10 15:24
laowan001
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:66
帖 子:1069
专家分:2613
注 册:2015-12-30
收藏
得分:0 
回复 10楼 csyx
方法可行,多谢多谢
2023-10-10 15:25
laowan001
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:66
帖 子:1069
专家分:2613
注 册:2015-12-30
收藏
得分:0 
以下是引用csyx在2023-10-10 21:06:28的发言:


是的,QUIT 前应加一条 CloseHandle

正确!!!
2023-10-11 08:35
laowan001
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:66
帖 子:1069
专家分:2613
注 册:2015-12-30
收藏
得分:0 
以下是引用星光悠蓝在2023-10-10 10:16:07的发言:

用两个值来记录,一个记录是否运行,另一个记录是否正常退出,下次如果检测为非正常退出,则可正常运行。

我脑子都转筋了还是没想明白
程序执行起来,是否运行=是,正常退出=否,这时断电了,那么再执行程序时看这两个变量的话,还是运行且未退出状态,仍然没法判断是否重复了
2023-10-11 08:41
laowan001
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:66
帖 子:1069
专家分:2613
注 册:2015-12-30
收藏
得分:0 
以下是引用yiyanxiyin在2023-10-11 09:42:38的发言:




这种方法是不行的, 因为非正常退出你没法记录状态, 和正在运行没法区别, 你可以搞个心跳, 比如每一秒记录一下当前时间(心跳时间), 表示它没死,  程序启动时检查心跳时间, 如果和现在的时间间隔超过2秒就允许启动,否则就不让启动


当然, 微软有标准api来判断, 产品里面还是使用标准的来吧, 自己琢磨搞着玩可以试试自己的方法

这个方法可行,就是有点麻烦,感谢回复

[此贴子已经被作者于2023-10-11 15:11编辑过]

2023-10-11 09:59
快速回复:关于避免EXE重复运行的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017467 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved