![]() |
Mutex Synchronisation funktioniert nicht?!
ich möchte zwei Programme mit einem Mutex synchronisieren.
Irgendwie geht das aber nicht. Der eine Button ist dazu da, einfach in einer while Schleife für 15 Sekunden zu "hängen" in der Zeit drückt man in der zweiten gestarteten Exe den anderen TestButton (btnSynCheckClick) , der ja dann warten müsste. Diese Anwendung hängt sich aber für ewig auf, und kommt bei WaitforsingleObject nie wieder ... Was mach ich falsch?
Delphi-Quellcode:
unit ufrm_Mutex;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TfrmMutex = class(TForm) btnThreadLoop: TButton; btnSynCheck: TButton; Memo1: TMemo; procedure btnThreadLoopClick(Sender: TObject); procedure btnSynCheckClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private-Deklarationen } public Mutex : THandle; end; var frmMutex: TfrmMutex; implementation {$R *.dfm} //============================================================================== procedure TfrmMutex.btnSynCheckClick(Sender: TObject); begin Memo1.Lines.add('Before Enter'); if WaitForSingleObject(Mutex, INFINITE) <> WAIT_OBJECT_0 then RaiseLastOSError; try finally ReleaseMutex(Mutex) end; Memo1.Lines.add('After Enter'); end; //============================================================================== procedure TfrmMutex.btnThreadLoopClick(Sender: TObject); var tout : Cardinal; begin if WaitForSingleObject(Mutex, INFINITE) <> WAIT_OBJECT_0 then RaiseLastOSError; try Memo1.Lines.add('Loop Begin'); tout := GetTickCount + 15000; while GetTickCount < tOut do begin sleep(1); end; // while finally ReleaseMutex(Mutex) end; Memo1.Lines.add('Loop End'); end; //============================================================================== procedure TfrmMutex.FormCreate(Sender: TObject); var FSA: SECURITY_ATTRIBUTES; FSD: SECURITY_DESCRIPTOR; begin InitializeSecurityDescriptor(@FSD, SECURITY_DESCRIPTOR_REVISION); SetSecurityDescriptorDacl(@FSD, true, nil, false); FSA.lpSecurityDescriptor := @FSD; FSA.nLength := sizeof(SECURITY_ATTRIBUTES); FSA.bInheritHandle := false; Mutex := CreateMutex(@FSA, true, PAnsiChar('Mutex1') ); Memo1.Lines.add('MutexHandle: ' + inttostr(Mutex) ); end; //============================================================================== procedure TfrmMutex.FormDestroy(Sender: TObject); begin CloseHandle(Mutex); end; end. |
AW: Mutex Synchronisation funktioniert nicht?!
Setz mal den bInitialOwner Parameter bei CreateMutex auf false, dann geht es :)
Edit mit Quote aus dem MSDN: Zitat:
Zitat:
|
AW: Mutex Synchronisation funktioniert nicht?!
Zitat:
(vielleicht war der Tag wohl doch schon etwas lang? ) .. ähm .. danke erstmal .. ich werde nochmal bissl rumtesten :? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:25 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