added wxSingleInstanceChecker class

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@10453 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2001-06-08 01:28:49 +00:00
parent f0822896b3
commit 68a602fcd2
7 changed files with 325 additions and 7 deletions

View File

@@ -299,6 +299,7 @@ scrolbar.cpp M
settings.cpp M settings.cpp M
slider95.cpp M 32 slider95.cpp M 32
slidrmsw.cpp M 16 slidrmsw.cpp M 16
snglinst.cpp M B
spinbutt.cpp M spinbutt.cpp M
spinctrl.cpp M spinctrl.cpp M
statbmp.cpp M statbmp.cpp M
@@ -327,6 +328,7 @@ dir.cpp U B
fontenum.cpp U fontenum.cpp U
fontutil.cpp U fontutil.cpp U
mimetype.cpp U B mimetype.cpp U B
snglinst.cpp U B
threadpsx.cpp U B threadpsx.cpp U B
utilsunx.cpp U B utilsunx.cpp U B
gsocket.c U B gsocket.c U B
@@ -710,6 +712,7 @@ setup.h W B
sizer.h W sizer.h W
slider.h W slider.h W
socket.h W B socket.h W B
snglinst.h W B
spinbutt.h W spinbutt.h W
spinctrl.h W spinctrl.h W
splash.h W splash.h W

View File

@@ -549,5 +549,6 @@ using any of them in the new programs:
\twocolitem{\helpref{wxEncodingConverter}{wxencodingconverter}}{Encoding conversions} \twocolitem{\helpref{wxEncodingConverter}{wxencodingconverter}}{Encoding conversions}
\twocolitem{\helpref{wxCalendarDateAttr}{wxcalendardateattr}}{Used with \helpref{wxCalendarCtrl}{wxcalendarctrl}} \twocolitem{\helpref{wxCalendarDateAttr}{wxcalendardateattr}}{Used with \helpref{wxCalendarCtrl}{wxcalendarctrl}}
\twocolitem{\helpref{wxQuantize}{wxquantize}}{Class to perform quantization, or colour reduction} \twocolitem{\helpref{wxQuantize}{wxquantize}}{Class to perform quantization, or colour reduction}
\twocolitem{\helpref{wxSingleInstanceChecker}{wxsingleinstancechecker}}{Check that only single program instance is running}
\end{twocollist} \end{twocollist}

View File

@@ -276,6 +276,7 @@
\input strlist.tex \input strlist.tex
\input propslv.tex \input propslv.tex
\input tokenizr.tex \input tokenizr.tex
\input snglinst.tex
\input sysclevt.tex \input sysclevt.tex
\input settings.tex \input settings.tex
\input tab.tex \input tab.tex

112
docs/latex/wx/snglinst.tex Normal file
View File

@@ -0,0 +1,112 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Name: snglinst.tex
%% Purpose: wxSingleInstanceChecker documentation
%% Author: Vadim Zeitlin
%% Modified by:
%% Created: 08.06.01
%% RCS-ID: $Id$
%% Copyright: (c) 2001 Vadim Zeitlin
%% License: wxWindows license
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{\class{wxSingleInstanceChecker}}\label{wxsingleinstancechecker}
wxSingleInstanceChecker class allows to check that only a single instance of a
program is running. To do it, you should create an object of this class. As
long as this object is alive, calls to
\helpref{IsAnotherRunning()}{wxsingleinstancecheckerisanotherrunning} from
other processes will return {\tt TRUE}.
As the object should have the life span as big as possible, it makes sense to
create it either as a global or in \helpref{wxApp::OnInit}{wxapponinit}. For
example:
\begin{verbatim}
bool MyApp::OnInit()
{
m_checker = new wxSingleInstanceChecker(GetAppName());
if ( m_checker->IsAnotherRunning() )
{
wxLogError(_("Another program instance is already running, aborting."));
return FALSE;
}
... more initializations ...
return TRUE;
}
int MyApp::OnExit()
{
delete m_checker;
return 0;
}
\end{verbatim}
This class is implemented for Win32 and Unix platforms supporting {\tt fcntl()}
system call only.
\wxheading{Derived from}
No base class
\wxheading{Data structures}
\latexignore{\rtfignore{\wxheading{Members}}}
\membersection{wxSingleInstanceChecker::wxSingleInstanceChecker}\label{wxsingleinstancecheckerctor}
\func{}{wxSingleInstanceChecker}{\void}
Default ctor, use \helpref{Create()}{wxsingleinstancecheckercreate} after it.
\membersection{wxSingleInstanceChecker::wxSingleInstanceChecker}\label{wxsingleinstancecheckerwxsingleinstancechecker}
\func{}{wxSingleInstanceChecker}{\param{const wxString\& }{name}, \param{const wxString\& }{path = wxEmptyString}}
Like \helpref{Create()}{wxsingleinstancecheckercreate} but without
error checking.
\membersection{wxSingleInstanceChecker::Create}\label{wxsingleinstancecheckercreate}
\func{bool}{Create}{\param{const wxString\& }{name}, \param{const wxString\& }{path = wxEmptyString}}
Initialize the object if it had been created using the default constructor.
Note that you can't call Create() more than once, so calling it if the
\helpref{non default ctor}{wxsingleinstancecheckerwxsingleinstancechecker}
had been used is an error.
\wxheading{Parameters}
\docparam{name}{must be given and be as unique as possible, it is used as the
mutex name under Win32 and the lock file name under Unix.
\helpref{GetAppName()}{wxappgetappname} may be a good value for this parameter}
\docparam{path}{is optional and is ignored under Win32 and used as the directory to
create the lock file in under Unix (default is
\helpref{wxGetHomeDir()}{wxgethomedir})
\wxheading{Return value}
Returns {\tt FALSE} if initialization failed, it doesn't mean that another
instance is running - use
\helpref{IsAnotherRunning()}{wxsingleinstancecheckerisanotherrunning} to check
for it.
\membersection{wxSingleInstanceChecker::IsAnotherRunning}\label{wxsingleinstancecheckerisanotherrunning}
\constfunc{bool}{IsAnotherRunning}{\void}
Returns {\tt TRUE} if another copy of this program is already running, {\tt
FALSE} otherwise.
\membersection{wxSingleInstanceChecker::\destruct{wxSingleInstanceChecker}}\label{wxsingleinstancecheckerdtor}
\func{}{\destruct{wxSingleInstanceChecker}}{\void}
Destructor frees the associated resources.
Note that it is not virtual, this class is not meant to be used polymorphically

View File

@@ -486,13 +486,6 @@
// smaller library. // smaller library.
#define wxUSE_HTML 1 #define wxUSE_HTML 1
// wxPlot is a class to display functions plots in wxWindow.
//
// Default is 1.
//
// Recommended setting: 1
#define wxUSE_PLOT 1
// OpenGL canvas // OpenGL canvas
#define wxUSE_GLCANVAS 0 #define wxUSE_GLCANVAS 0
@@ -503,6 +496,15 @@
// miscellaneous settings // miscellaneous settings
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// wxSingleInstanceChecker class allows to verify at startup if another program
// instance is running (it is only available under Win32)
//
// Default is 1
//
// Recommended setting: 1 (the class is tiny, disabling it won't save much
// space)
#define wxUSE_SNGLINST_CHECKER 1
#define wxUSE_IPC 1 #define wxUSE_IPC 1
// 0 for no interprocess comms // 0 for no interprocess comms
#define wxUSE_HELP 1 #define wxUSE_HELP 1

67
include/wx/snglinst.h Normal file
View File

@@ -0,0 +1,67 @@
///////////////////////////////////////////////////////////////////////////////
// Name: wx/snglinst.h
// Purpose: wxSingleInstanceChecker can be used to restrict the number of
// simultaneously running copies of a program to one
// Author: Vadim Zeitlin
// Modified by:
// Created: 08.06.01
// RCS-ID: $Id$
// Copyright: (c) 2001 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifndef _WX_SNGLINST_H_
#define _WX_SNGLINST_H_
#ifdef __GNUG__
#pragma interface "snglinst.h"
#endif
#if wxUSE_SNGLINST_CHECKER
// ----------------------------------------------------------------------------
// wxSingleInstanceChecker
// ----------------------------------------------------------------------------
class WXDLLEXPORT wxSingleInstanceChecker
{
public:
// default ctor, use Create() after it
wxSingleInstanceChecker() { Init(); }
// like Create() but no error checking (dangerous!)
wxSingleInstanceChecker(const wxString& name,
const wxString& path = wxEmptyString)
{
Init();
Create(name, path);
}
// name must be given and be as unique as possible, it is used as the mutex
// name under Win32 and the lock file name under Unix -
// wxTheApp->GetAppName() may be a good value for this parameter
//
// path is optional and is ignored under Win32 and used as the directory to
// create the lock file in under Unix (default is wxGetHomeDir())
//
// returns FALSE if initialization failed, it doesn't mean that another
// instance is running - use IsAnotherRunning() to check it
bool Create(const wxString& name, const wxString& path = wxEmptyString);
// is another copy of this program already running?
bool IsAnotherRunning() const;
// dtor is not virtual, this class is not meant to be used polymorphically
~wxSingleInstanceChecker();
private:
// common part of all ctors
void Init() { m_impl = NULL; }
// the implementation details (platform specific)
class WXDLLEXPORT wxSingleInstanceCheckerImpl *m_impl;
};
#endif // wxUSE_SNGLINST_CHECKER
#endif // _WX_SNGLINST_H_

132
src/msw/snglinst.cpp Normal file
View File

@@ -0,0 +1,132 @@
///////////////////////////////////////////////////////////////////////////////
// Name: msw/snglinst.cpp
// Purpose: implements wxSingleInstanceChecker class for Win32 using
// named mutexes
// Author: Vadim Zeitlin
// Modified by:
// Created: 08.06.01
// RCS-ID: $Id$
// Copyright: (c) 2001 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
// License: wxWindows license
///////////////////////////////////////////////////////////////////////////////
// ============================================================================
// declarations
// ============================================================================
// ----------------------------------------------------------------------------
// headers
// ----------------------------------------------------------------------------
#ifdef __GNUG__
#pragma implementation "snglinst.h"
#endif
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#if wxUSE_SNGLINST_CHECKER && defined(__WIN32__)
#ifndef WX_PRECOMP
#include "wx/string.h"
#include "wx/log.h"
#endif //WX_PRECOMP
#include "wx/snglinst.h"
#include "wx/msw/private.h"
// ----------------------------------------------------------------------------
// wxSingleInstanceCheckerImpl: the real implementation class
// ----------------------------------------------------------------------------
class WXDLLEXPORT wxSingleInstanceCheckerImpl
{
public:
wxSingleInstanceCheckerImpl()
{
// we don't care about m_wasOpened, it can't be accessed before being
// initialized
m_hMutex = NULL;
}
bool Create(const wxString& name)
{
m_hMutex = ::CreateMutex(NULL, FALSE, name);
if ( !m_hMutex )
{
wxLogLastError(_T("CreateMutex"));
return FALSE;
}
// mutex was either created or opened - see what really happened
m_wasOpened = ::GetLastError() == ERROR_ALREADY_EXISTS;
return TRUE;
}
bool WasOpened() const
{
wxCHECK_MSG( m_hMutex, FALSE,
_T("can't be called if mutex creation failed") );
return m_wasOpened;
}
~wxSingleInstanceCheckerImpl()
{
if ( m_hMutex )
{
if ( !::CloseHandle(m_hMutex) )
{
wxLogLastError(_T("CloseHandle(mutex)"));
}
}
}
private:
// the result of the CreateMutex() call
bool m_wasOpened;
// the mutex handle, may be NULL
HANDLE m_hMutex;
};
// ============================================================================
// wxSingleInstanceChecker implementation
// ============================================================================
bool wxSingleInstanceChecker::Create(const wxString& name,
const wxString& path)
{
wxASSERT_MSG( !m_impl,
_T("calling wxSingleInstanceChecker::Create() twice?") );
// creating unnamed mutex doesn't have the same semantics!
wxASSERT_MSG( !name.empty(), _T("mutex name can't be empty") );
m_impl = new wxSingleInstanceCheckerImpl;
return m_impl->Create(name);
}
bool wxSingleInstanceChecker::IsAnotherRunning() const
{
wxCHECK_MSG( m_impl, FALSE, _T("must call Create() first") );
// if the mutex had been opened, another instance is running - otherwise we
// would have created it
return m_impl->WasOpened();
}
wxSingleInstanceChecker::~wxSingleInstanceChecker()
{
delete m_impl;
}
#endif // wxUSE_SNGLINST_CHECKER