全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:7732
推到 Plurk!
推到 Facebook!

如何用 CreateMutex 避免程式重複執行 ?

缺席
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2006-11-24 14:36:19 IP:219.87.xxx.xxx 未訂閱
如何用 CreateMutex 避免程式重複執行 ?
小弟用 "重複執行" 搜尋看過舊文章了 , 想用 CreateMutex 避免程式重複執行 ? ( FindWindows 似乎不是好做法)
小弟找到一個程式, 但是 Compile 有錯, 請問該如何修正 ? THX
Project1.dpr
program Project1;
uses
Forms,
Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
begin
Application.Initialize;
if CreateMutex then // Undeclared identifier: CreateMutex, 該如何修正 ?
begin
Application.CreateForm(TForm1, Form1);
Application.Run;
end
else
DestroyMutex;
end.
=====================================================
Unit1.pas
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
// function CreateMutex: Boolean; // 錯誤
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
var
Mutex: hWnd;
function CreateMutex: Boolean;
var
PrevInstHandle: THandle;
AppTitle: PChar;
begin
AppTitle := StrAlloc(100);
StrPCopy(AppTitle, Application.Title);
Result := True;
Mutex := Windows.CreateMutex(nil, False, AppTitle);
if (GetLastError = ERROR_ALREADY_EXISTS) or (Mutex = 0) then begin
Result := False;
SetWindowText(Application.Handle, '');
PrevInstHandle := FindWindow(nil, AppTitle);
if PrevInstHandle <> 0 then begin
if IsIconic(PrevInstHandle) then
ShowWindow(PrevInstHandle, SW_RESTORE)
else
BringWindowToTop(PrevInstHandle);
SetForegroundWindow(PrevInstHandle);
end;
if Mutex <> 0 then
Mutex := 0;
end;
StrDispose(AppTitle);
end;
procedure DestroyMutex;
begin
if Mutex <> 0 then
CloseHandle(Mutex);
end;

end.

------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2006-11-24 14:46:35 IP:219.87.xxx.xxx 未訂閱
找到一個可用的範例 
修改 Project1.dpr 內容
program Project1;
uses
Forms, Windows,
Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
var
Mutex : THandle;
begin
Mutex := CreateMutex(nil, True, 'My_Unique_Application_Mutex_Name');
if (Mutex = 0) OR (GetLastError = ERROR_ALREADY_EXISTS) then
begin
// code to searh for, and activate
// the previous (first) instance
end
else
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
if Mutex <> 0 then
CloseHandle(Mutex);
end;
end.

------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
wpf
一般會員


發表:11
回覆:22
積分:6
註冊:2002-04-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2006-11-28 16:39:29 IP:210.76.xxx.xxx 未訂閱
隐约记得几年前用mutex 来控制 单例执行的时候,好像如果机器死机重起了,程序就再也启动不起来了,似乎是用mutex要保证程序正确退出,也许当初我用的不对吧
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-01-09 10:42:36 IP:210.69.xxx.xxx 未訂閱
小弟再提供一種方法
用程序 (process) 數量判斷是否重複執行函式
http://delphi.ktop.com.tw/board.php?cid=30&fid=72&tid=86113

===================引 用 文 章===================

隐约记得几年前用mutex 来控制 单例执行的时候,好像如果机器死机重起了,程序就再也启动不起来了,似乎是用mutex要保证程序正确退出,也许当初我用的不对吧
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
系統時間:2024-11-22 12:50:52
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!