AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Mutex zwischen 2 Prozessen

Ein Thema von TimWu · begonnen am 2. Nov 2018 · letzter Beitrag vom 2. Nov 2018
Antwort Antwort
TimWu

Registriert seit: 27. Okt 2016
16 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#1

AW: Mutex zwischen 2 Prozessen

  Alt 2. Nov 2018, 12:23
Natürlich könnte ich ein bestehendes Mutex freigeben, das ist aber nicht meine Absicht.

Ich möchte das Mutex nutzen um zu Prüfen ob das Programm bereits gestartet ist. Wenn ich das Mutex einfach freigebe wiederspräche es seinem Sinn

Kannst du bitte versuchen mein Problem einmal nachzuvollziehen?

Zitat:
locken in 1. Anwendung
locken in 2. Anwendung schlägt fehl
unlocken in 1. Anwendung
locken in 1. Anwendung schlägt fehl
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.368 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Mutex zwischen 2 Prozessen

  Alt 2. Nov 2018, 12:31
Kannst du bitte versuchen mein Problem einmal nachzuvollziehen?
Kannst du bitte versuchen zu verstehen, was ich schreibe?

Due erzeugst in deiner Prozedur ein neues LOKALES Handle auf das Mutex. Und zwar jedesmal ein weiteres, wenn du den Button drückst. Beim ersten mal weißt du LMutex dem FMutex zu. Alle weiteren CreateMutex werden von dir nicht wieder freigegeben. Und genau das verursacht das von dir beschriebene Problem.

Code:
Es wird doch kein neues Handle erzeugt, wenn ein Fehler auftritt..
wenn das Mutex bereits existiert, wird das Handle des bestehenden Mutex zurückgeliefert
Bitte benutze den Debugger und schaue dir an, was das CreateMutex zurückgibt. Es ist ein neues Handle. Zumindest ist das bei mir so.
Peter

Geändert von Jasocul ( 2. Nov 2018 um 13:01 Uhr) Grund: Eine inhaltliche Korrektur
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: Mutex zwischen 2 Prozessen

  Alt 2. Nov 2018, 12:41
Bitte benutze den Debugger und schaue dir an, was das CreateMutex zurückgibt. Es ist ein neues Handle. Zumindest ist das bei mir so.
Zitat:
If the mutex is a named mutex and the object existed before this function call, the return value is a handle to the existing object, GetLastError returns ERROR_ALREADY_EXISTS, bInitialOwner is ignored, and the calling thread is not granted ownership. However, if the caller has limited access rights, the function will fail with ERROR_ACCESS_DENIED and the caller should use the OpenMutex function.
Das Handle ist ein neues, aber das dahinterliegende Mutex ist immer noch das selbe.
1 Mutex - mehrere Handles zu diesem Mutex.

Interessant ist in diesem Fall wahrscheinlich, dass GetLastError ERROR_ALREADY_EXISTS zurückgibt, falls das Mutex schon existiert hat und kein neues erstellt wurde.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

Geändert von Neutral General ( 2. Nov 2018 um 12:43 Uhr)
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#4

AW: Mutex zwischen 2 Prozessen

  Alt 2. Nov 2018, 12:53
Hier etwas funktionierendes zum Spielen
Delphi-Quellcode:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages,
  System.SysUtils, System.Variants, System.Classes, System.SyncObjs,
  Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class( TForm )
    Button1: TButton;
    Button2: TButton;
    procedure Button1_Click( Sender: TObject );
    procedure Button2_Click( Sender: TObject );
  private
    FMutex: TMutex;
  public
    procedure AfterConstruction; override;
    procedure BeforeDestruction; override;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

const
  Mutex_Name = {$IFDEF GLOBAL}'global\'+{$ENDIF}'MyMutex';

procedure TForm1.AfterConstruction;
begin
  inherited;
  FMutex := TMutex.Create( nil, false, Mutex_Name );
end;

procedure TForm1.BeforeDestruction;
begin
  FMutex.Free;
  inherited;
end;

procedure TForm1.Button1_Click( Sender: TObject );
begin
  if FMutex.WaitFor( 0 ) = TWaitResult.wrSignaled
  then
    begin
      // We have the mutex
      Button1.Enabled := false;
      Button2.Enabled := True;
    end;
end;

procedure TForm1.Button2_Click( Sender: TObject );
begin
  // We have the mutex, so we release it
  FMutex.Release;
  Button1.Enabled := True;
  Button2.Enabled := false;
end;

end.
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.368 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Mutex zwischen 2 Prozessen

  Alt 2. Nov 2018, 12:56
@Michael:
Ja, du hast Recht. Es ist ein neues Handle auf das selbe Mutex. Dennoch muss das Handle wieder freigegeben werden.
Peter
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: Mutex zwischen 2 Prozessen

  Alt 2. Nov 2018, 12:57
Da hast du Recht
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.368 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Mutex zwischen 2 Prozessen

  Alt 2. Nov 2018, 13:04
Vielleicht nochmal eine andere Formulierung:
CreateMutex erzeugt ein Handle auf ein Mutex.
Existiert dieses bereits, wird ein neues Handle darauf erzeugt, allerdings gibt es dann auch ein GetLastError.
Diese neue Handle muss natürlich auch wieder freigegeben werden, da es sonst zu den beschriebenen Problemen führt. Und diese Freigabe fehlt bisher.
Peter
  Mit Zitat antworten Zitat
TimWu

Registriert seit: 27. Okt 2016
16 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#8

AW: Mutex zwischen 2 Prozessen

  Alt 2. Nov 2018, 13:49
Hier etwas funktionierendes zum Spielen
...
damit hat es funktioniert.

mir war nicht bewusst, dass ein weiteres Handle den Mutex "sperrt".

Ich danke euch für die schnelle Hilfe
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:39 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz