DanDaemon
asked on
Clone controller
Hello guys,
I need to get component or function to make clone control function.
Better if this function will work with mutex. Fast and good.
Thanks,
Dan
I need to get component or function to make clone control function.
Better if this function will work with mutex. Fast and good.
Thanks,
Dan
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
the findwindow is used just in MenuDependent mode....
You can remove that part if you don't need it or just check for a mutex created by the menu (if you need this feauture)...
You can remove that part if you don't need it or just check for a mutex created by the menu (if you need this feauture)...
ASKER
:) I so though... Thanks
Glad to have helped you :)
F68 ;-)
F68 ;-)
What's a clone control function, exactly? :)
I happen to have an interesting unit at http://www.workshop-alex.org/Sources/untExtraInterfaces.pas that wraps an interface around mutexes, events, critical sections and semaphores that make them quite easy to use.
If you want to discover if a process is running, the mutex will work quite nicely. So is the Semaphore, which could limit your application to an X amount of processes running at the same time. But an alternative could be the use of an event...
Instead of a Mutex, you could use an event. Give it some unique name. In a special thread, you just wait for an infinite time until it is triggered. When the second application creates it, my IEvent interface wil set the Existing property to true, so you know it's a second call to the application. In that case, you set the event so the original application will be triggered to do something. Your second application could then close itself again.
Haven't tested it myself, though. But theoretically, it should work.
I happen to have an interesting unit at http://www.workshop-alex.org/Sources/untExtraInterfaces.pas that wraps an interface around mutexes, events, critical sections and semaphores that make them quite easy to use.
If you want to discover if a process is running, the mutex will work quite nicely. So is the Semaphore, which could limit your application to an X amount of processes running at the same time. But an alternative could be the use of an event...
Instead of a Mutex, you could use an event. Give it some unique name. In a special thread, you just wait for an infinite time until it is triggered. When the second application creates it, my IEvent interface wil set the Existing property to true, so you know it's a second call to the application. In that case, you set the event so the original application will be triggered to do something. Your second application could then close itself again.
Haven't tested it myself, though. But theoretically, it should work.
As a simple example:
program Bang;
{$APPTYPE CONSOLE}
uses
Classes,
untExtraInterfaces;
type
TMyThread = class( TThread )
private
Event: IEvent;
protected
procedure Execute; override;
public
constructor Create;
destructor Destroy; override;
end;
constructor TMyThread.Create;
begin
inherited Create( False );
FreeOnTerminate := False;
Event := NewEvent( False, False, 'UniqueName' );
Resume;
end;
destructor TMyThread.Destroy;
begin
Event := nil;
inherited;
end;
procedure TMyThread.Execute;
var
Count: Integer;
begin
if Event.Existing then begin
WriteLn( 'Application already running.' );
Event.Signal;
end
else begin
WriteLn( 'First-time run.' );
Count := 5;
repeat
repeat until Event.Wait( 1000 );
WriteLn( 'We got triggered. Counts left: ', Count );
Dec( Count );
until ( Count = 0 );
end;
end;
begin
TMyThread.Create.WaitFor;
ReadLn;
end.
program Bang;
{$APPTYPE CONSOLE}
uses
Classes,
untExtraInterfaces;
type
TMyThread = class( TThread )
private
Event: IEvent;
protected
procedure Execute; override;
public
constructor Create;
destructor Destroy; override;
end;
constructor TMyThread.Create;
begin
inherited Create( False );
FreeOnTerminate := False;
Event := NewEvent( False, False, 'UniqueName' );
Resume;
end;
destructor TMyThread.Destroy;
begin
Event := nil;
inherited;
end;
procedure TMyThread.Execute;
var
Count: Integer;
begin
if Event.Existing then begin
WriteLn( 'Application already running.' );
Event.Signal;
end
else begin
WriteLn( 'First-time run.' );
Count := 5;
repeat
repeat until Event.Wait( 1000 );
WriteLn( 'We got triggered. Counts left: ', Count );
Dec( Count );
until ( Count = 0 );
end;
end;
begin
TMyThread.Create.WaitFor;
ReadLn;
end.
Darn. Already accepted? And I thought the method by events was much nicer. :)
ASKER
Probably you have same which does not use function FindWindow?
I do not want to use this function :)
Thanks,
Dmitry