如何避免程序重複執行
出自VFP Wiki
小 |
小 |
||
(3個中途的修訂版本沒有顯示) | |||
第5行: | 第5行: | ||
檢查視窗標題 | 檢查視窗標題 | ||
<code> | <code> | ||
- | + | *防止重複運行 | |
- | * 防止重複運行 | + | |
- | + | ||
PROCEDURE ReEntry | PROCEDURE ReEntry | ||
PARAMETERS lcTitle | PARAMETERS lcTitle | ||
第39行: | 第37行: | ||
因為開啟專用模式,所以,當您的程式不管在什麼地方啟用,只要是在同一部電腦,它即無法重覆開啟 Start.DBF 這個檔案,如此即代表程式正在運作中,但是,如果是當機或是程式不幸不正常結束,Start.DBF 也會被系統自動的解開使用狀態,您再一次的開啟程式,也不會有樓上朋友所說的問題.... | 因為開啟專用模式,所以,當您的程式不管在什麼地方啟用,只要是在同一部電腦,它即無法重覆開啟 Start.DBF 這個檔案,如此即代表程式正在運作中,但是,如果是當機或是程式不幸不正常結束,Start.DBF 也會被系統自動的解開使用狀態,您再一次的開啟程式,也不會有樓上朋友所說的問題.... | ||
現在唯一要注意的是,這個檔案(Start.DBF)的創建過程及在Win9x下的運作,因為我很久沒有用 Win9x 了,所以我不太確定 GetEnv("WinDir")是否能正確取得系統變數... | 現在唯一要注意的是,這個檔案(Start.DBF)的創建過程及在Win9x下的運作,因為我很久沒有用 Win9x 了,所以我不太確定 GetEnv("WinDir")是否能正確取得系統變數... | ||
+ | |||
+ | ====產生檔案之三==== | ||
+ | 提供者:不知名 | ||
+ | <pre> | ||
+ | PROCEDURE IsAppRunning | ||
+ | LOCAL lcFile_name | ||
+ | lcFile_name = "RUNNING.DBF" | ||
+ | CD SYS(2023) | ||
+ | IF NOT FILE(lcFile_Name) | ||
+ | CREATE TABLE (lcFile_name) (text c(30)) | ||
+ | APPE BLAN | ||
+ | REPL text WITH "Don't remove this file" | ||
+ | ELSE | ||
+ | lcOldError = ON("ERROR") | ||
+ | ON ERROR DO cancel_app | ||
+ | USE (lcFile_name) IN 0 EXCL | ||
+ | ON ERROR &lcOldError | ||
+ | ENDI | ||
+ | RETURN | ||
+ | PROCEDURE cancel_app | ||
+ | lcOnShutdown= "APP_QUIT()" | ||
+ | ON SHUTDOWN | ||
+ | ON SHUTDOWN &lcOnShutDown | ||
+ | =MESSAGEBOX("There is already an instance of this application | ||
+ | running."+chr(13)+"Shutting down.",64,"Assurance") | ||
+ | QUIT | ||
+ | RETURN | ||
+ | </pre> | ||
====利用WMI==== | ====利用WMI==== | ||
第44行: | 第70行: | ||
限制: Windows 2000 或以上的版本 | 限制: Windows 2000 或以上的版本 | ||
用 Win2K Management Object 了嗎?這可以結束正在執行中的 process,當然也就可以偵測正在執行中的 process 囉! | 用 Win2K Management Object 了嗎?這可以結束正在執行中的 process,當然也就可以偵測正在執行中的 process 囉! | ||
+ | |||
+ | ====利用Mutex==== | ||
+ | 提供者:Remus | ||
+ | <pre> | ||
+ | declare integer CreateMutex in win32api integer,integer,string | ||
+ | declare integer WaitForSingleObject in win32api integer,integer | ||
+ | hHandle=CreateMutex(0,1,"SomeApplictaionDefinedUniqueName") | ||
+ | nState=WaitForSingleObject(hHandle,0) | ||
+ | </pre> | ||
+ | 如果是第一次執行,nState 會是 0(STATUS_WAIT_0),之後其他副本執行時,得到的值是 258 (STATUS_TIMEOUT) |
在2008年4月7日 (一) 12:45的最新修訂版本
目錄 |
利用FindWindows
提供者: violetlkk
檢查視窗標題
- 防止重複運行
PROCEDURE ReEntry
PARAMETERS lcTitle DECLARE integer FindWindow IN win32api string,string IF FindWindow(0,lcTitle)<>0 CLEAR DLLS RETURN .t. ELSE CLEAR dlls RETURN .f. ENDIF
ENDPROC
if ReEntry('your_windows_caption')
=messagebox("不可重複執行") quit
endif
產生檔案之一
提供者: erwin_ho 一啟動就產生一個固定的檔案名稱(程式結束時把它刪除) 若執行時檢查有這檔案存在表示已執行過
產生檔案之二
提供者: summer 若不會用API的話,有一個最笨及最原始的方法,而且不會因執行程式因不正常關閉而造成一起問題... 方法如下: 當程式開啟時,至 GETEVN("WinDir") 下開啟一個 .DBF 檔,並且直接用 Use 的專用模式開啟.....如 Use (GETEVN("WinDir") + "\Start") in 0 Alias startup 原理: 因為開啟專用模式,所以,當您的程式不管在什麼地方啟用,只要是在同一部電腦,它即無法重覆開啟 Start.DBF 這個檔案,如此即代表程式正在運作中,但是,如果是當機或是程式不幸不正常結束,Start.DBF 也會被系統自動的解開使用狀態,您再一次的開啟程式,也不會有樓上朋友所說的問題.... 現在唯一要注意的是,這個檔案(Start.DBF)的創建過程及在Win9x下的運作,因為我很久沒有用 Win9x 了,所以我不太確定 GetEnv("WinDir")是否能正確取得系統變數...
產生檔案之三
提供者:不知名
PROCEDURE IsAppRunning LOCAL lcFile_name lcFile_name = "RUNNING.DBF" CD SYS(2023) IF NOT FILE(lcFile_Name) CREATE TABLE (lcFile_name) (text c(30)) APPE BLAN REPL text WITH "Don't remove this file" ELSE lcOldError = ON("ERROR") ON ERROR DO cancel_app USE (lcFile_name) IN 0 EXCL ON ERROR &lcOldError ENDI RETURN PROCEDURE cancel_app lcOnShutdown= "APP_QUIT()" ON SHUTDOWN ON SHUTDOWN &lcOnShutDown =MESSAGEBOX("There is already an instance of this application running."+chr(13)+"Shutting down.",64,"Assurance") QUIT RETURN
利用WMI
提供者: Chris Lee 限制: Windows 2000 或以上的版本 用 Win2K Management Object 了嗎?這可以結束正在執行中的 process,當然也就可以偵測正在執行中的 process 囉!
利用Mutex
提供者:Remus
declare integer CreateMutex in win32api integer,integer,string declare integer WaitForSingleObject in win32api integer,integer hHandle=CreateMutex(0,1,"SomeApplictaionDefinedUniqueName") nState=WaitForSingleObject(hHandle,0)
如果是第一次執行,nState 會是 0(STATUS_WAIT_0),之後其他副本執行時,得到的值是 258 (STATUS_TIMEOUT)