我在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;麻烦高手解决一下

解决方案 »

  1.   

    上面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; 
      

  2.   

    改了改你的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;
      

  3.   

    完善一下:
    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;
      

  4.   


    //先定义了一个全局句柄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; 
      

  5.   

    我是要求Button1Click与Button2Click建立互斥,应该怎么做。
      

  6.   

    我的Button1Click与Button2Click事件代码如下:////先定义了一个全局句柄mutexhalprocedure 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还提示“对不起,些程序已运行”
      

  7.   

    因为你执行一次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;
      

  8.   


    非常感谢unsigned,调试成功谢谢!!!