delphi API互斥量的问题

gdxg0762 2008-12-23 12:51:05

我在Button2Click上面创建了一个互斥量,然后在Button1Click来判断Button2Click是否正在运行。我先单击了Button2Click,后单击Button1Click,提示Button2Click一直在运行,这是为什么呢?
代码如下:

procedure TForm1.Button1Click(Sender: TObject);
begin
if OpenMutex(MUTEX_ALL_ACCESS, FALSE, 'Run1') <> 0 then
begin
ShowMessage('对不起,Button2在运行');
Exit;
end;
end;



procedure TForm1.Button2Click(Sender: TObject);
var
i,sum:integer;
begin
sum:=1;
for i:=0 to 1000 do
begin
sum:=sum+i;
label1.Caption :=inttostr(sum);
Application.ProcessMessages;
end;
ReleaseMutex(mutexhal);
exit;
end;

麻烦高手解决一下
...全文
166 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
gdxg0762 2008-12-23
  • 打赏
  • 举报
回复
上面TForm1.Button2Click少了一行代码加入如下:

procedure TForm1.Button2Click(Sender: TObject);
var
i,sum:integer;
begin
mutexhal := CreateMutex(nil, TRUE, 'Run1');
sum:=1;
for i:=0 to 1000 do
begin
sum:=sum+i;
label1.Caption :=inttostr(sum);
Application.ProcessMessages;
end;
ReleaseMutex(mutexhal);
exit;
end;
gdxg0762 2008-12-23
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 unsigned 的回复:]
因为你执行一次OpenMutex成功就会增加一次引用计数,而你没有使用CloseHandle释放,就永远释放不了,所以一直提示正在运行。

Delphi(Pascal) codevar
local_mutexhal: THandle;
begin
local_mutexhal := OpenMutex(MUTEX_ALL_ACCESS, FALSE, 'Run1');
if local_mutexhal<> 0 then //
begin
CloseHandle(local_mutexhal);
ShowMessage('对不起,此程序已运行'+IntToStr(GetLastError));
end;
end;
[/Quote]

非常感谢unsigned,调试成功谢谢!!!
僵哥 2008-12-23
  • 打赏
  • 举报
回复
因为你执行一次OpenMutex成功就会增加一次引用计数,而你没有使用CloseHandle释放,就永远释放不了,所以一直提示正在运行。
var
local_mutexhal: THandle;
begin
local_mutexhal := OpenMutex(MUTEX_ALL_ACCESS, FALSE, 'Run1');
if local_mutexhal<> 0 then //
begin
CloseHandle(local_mutexhal);
ShowMessage('对不起,此程序已运行'+IntToStr(GetLastError));
end;
end;
gdxg0762 2008-12-23
  • 打赏
  • 举报
回复
我的Button1Click与Button2Click事件代码如下:

////先定义了一个全局句柄mutexhal

procedure TForm1.Button2Click(Sender: TObject);
var
i,sum:integer;
begin
sum:=1;
mutexhal := CreateMutex(nil, TRUE, 'Run1');
for i:=0 to 1000 do
begin
sum:=sum+i;
label1.Caption :=inttostr(sum);
Application.ProcessMessages;
sleep(1);
end;
ReleaseMutex(mutexhal);
CloseHandle(mutexhal);
exit;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
hpa,hc:HWND;
begin
if OpenMutex(MUTEX_ALL_ACCESS, FALSE, 'Run1') <> 0 then //
begin
ShowMessage('对不起,些程序已运行');
end;
//hpa:=Findwindow(nil,Pchar('form2'));
//hc:=FindWindowEx(hpa,0,nil,Pchar('button1'));
//SendMessage(hpa,WM_COMMAND,BN_CLICKED,hc);
//label1.Caption :='??????? !!!!';
end;

当Button2Click还没有运行结束的时候,我单击Button1Click提示是正确的,提示“对不起,些程序已运行”,当Button2Click运行结束了,单击Button1Click还提示“对不起,些程序已运行”
gdxg0762 2008-12-23
  • 打赏
  • 举报
回复
我是要求Button1Click与Button2Click建立互斥,应该怎么做。
gdxg0762 2008-12-23
  • 打赏
  • 举报
回复

//先定义了一个全局句柄mutexhal
procedure TForm1.Button1Click(Sender: TObject);
begin
if OpenMutex(MUTEX_ALL_ACCESS, FALSE, 'Run1') <> 0 then
begin
ShowMessage('对不起,Button2在运行');
Exit;
end;
end;


procedure TForm1.Button2Click(Sender: TObject);
var
i,sum:integer;
begin
mutexhal := CreateMutex(nil, TRUE, 'Run1');
sum:=1;
for i:=0 to 1000 do
begin
sum:=sum+i;
label1.Caption :=inttostr(sum);
Application.ProcessMessages;
end;
ReleaseMutex(mutexhal);
exit;
end;

JPEXE 2008-12-23
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 unsigned 的回复:]
ReleaseMutex之后记得CloseHandle
[/Quote]
提醒得是
僵哥 2008-12-23
  • 打赏
  • 举报
回复
ReleaseMutex之后记得CloseHandle
JPEXE 2008-12-23
  • 打赏
  • 举报
回复
完善一下:
procedure TForm1.Button1Click(Sender: TObject);
var
hMutex: THandle;
begin
hMutex := CreateMutex(nil, True, 'Run1');
if GetLastError = ERROR_ALREADY_EXISTS then
begin
ShowMessage('对不起,Button2在运行');
Exit;
end
else
begin
if hMutex <> 0 then
begin
ReleaseMutex(hMutex);
end;
end;
end;
starluck 2008-12-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 gdxg0762 的回复:]
上面TForm1.Button2Click少了一行代码加入如下:

procedure TForm1.Button2Click(Sender: TObject);
var
i,sum:integer;
begin
mutexhal := CreateMutex(nil, TRUE, 'Run1');
sum:=1;
for i:=0 to 1000 do
begin
sum:=sum+i;
label1.Caption :=inttostr(sum);
Application.ProcessMessages;
end;
ReleaseMutex(mutexhal);
exit;
end;
[/Quote]

支持二樓,互斥沒有建立
JPEXE 2008-12-23
  • 打赏
  • 举报
回复
改了改你的Button1Click事件,判断应该用CreateMutex而不是OpenMutex.
procedure TForm1.Button1Click(Sender: TObject);
begin
CreateMutex(nil, True, 'Run1');
if GetLastError = ERROR_ALREADY_EXISTS then
begin
ShowMessage('对不起,Button2在运行');
Exit;
end;
end;

1,184

社区成员

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

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