如何避免程序重複執行

出自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)