ATOUTFOX
COMMUNAUTÉ FRANCOPHONE DES PROFESSIONNELS FOXPRO
Visual FoxPro : le développement durable

Forum AtoutFox : Re: Question posée plusieurs fois (une seule instance de l'application)   

Sujet

rss Flux RSS des derniers messages

Vous devez vous identifier pour pouvoir poser une question ou répondre.

dim. 25 novembre 2012, 14h03
Gregory Adam
Belgique Belgique

atoutfox.public.association

Re: Question posée plusieurs fois (une seule instance de l'application)

> Mr Greg un conseil ?

Oui, Francis, un Mutex

C'est une chose que j'utiluse quand je veux qu'une seule instance execute du code. Par exemple pour impimer en pdf, j'utilise BullZip. La, il y a moyen de creer, concatener des etats. Le probleme, c'est que cela foire quand plus d'une appli essaye de faire la meme chose

Pour eviter cela, je cree un object Mutex que je garde 'en vie' pendant l'operation.
Quand une deuxieme appli veut creer cet objet, cela ne marchera pas tant que la premiere a released son objet


On peut donner un nom a un mutex, donc tu n'as que embarras du choix

Utilisation
local obj, nom, essayerPendantMilliSecondes

nom = 'Francis'
essayerPendantMilliSecondes = 0


if( !Mutex_Object(@.obj, m.nom, m.essayerPendantMilliSecondes) )
   ?'Operation deja en cours'
else
    && faire ce que tu veux

  obj= null && permet a d'autres de creer le mutex
endif




La classe ( tu verras que les api ne sont declarees que lorsqu'on en a besoin)
#include FoxPro.h
*_______________________________________________________________________________
#define true  .t.
#define false  .f.
*_______________________________________________________________________________

#define MUTEX_CLASS  [_Mutex_Class_]

*_______________________________________________________________________________
function Mutex_Object(obj, mutexName, tryDuringMilliseconds)

  local success
  success = true


  obj = null

  try
    obj = createObject(MUTEX_CLASS, m.mutexName, m.tryDuringMilliseconds)

  catch
    assert false
    success = false
  endtry

  return m.success and (vartype(m.obj) == T_OBJECT)

endfunc
*_______________________________________________________________________________
*===============================================================================
*===============================================================================
*===============================================================================
define class MUTEX_CLASS as Relation

  protected MutexHandle
  MutexHandle = 0
*_______________________________________________________________________________
#define ERROR_ALREADY_EXISTS  183

protected function Init(mutexName, tryDuringMilliseconds)

  local success
  success = true

  local handle, lasterror, i

  do case
  case !m.success

  case !m.this.IsChar(m.mutexName, true)
    error 11
    success = false

  case !m.this.IsNonNegativeInteger(m.tryDuringMilliseconds)
    error 11
    success = false

  otherwise
    for i = m.tryDuringMilliseconds to 0 step -100

      handle = CreateMutex(null, 1, @m.mutexName)
      lasterror = GetLastError()

      do case
      case empty(m.handle)

      case inlist(m.lasterror, ERROR_ALREADY_EXISTS)
        =CloseHandle(m.handle)
        handle = 0

      otherwise
        exit

      endcase
      =Inkey(.100)
    endfor


  endcase

  do case
  case !m.success

  case empty(m.handle)
    assert false
    success = false

  otherwise
    this.MutexHandle = m.handle

  endcase

  return m.success

endfunc
*_______________________________________________________________________________
*_______________________________________________________________________________
protected function Destroy()

  do case
  case empty(m.this.MutexHandle)

  case empty(CloseHandle(m.this.MutexHandle))
    assert false

  endcase

  return DoDefault()
endfunc
*_______________________________________________________________________________
protected function IsChar(s, needFilled)

  return   inlist(vartype(m.s), T_CHARACTER, T_MEMO) ;
    and iif(m.needFilled, !empty(len(m.s)), true)

endfunc
*_______________________________________________________________________________
protected function IsNonNegativeInteger(s)

  return m.this.IsInteger(m.s) and ( m.s >= 0 )

endfunc
*_______________________________________________________________________________
protected function IsInteger(s)

  return m.this.IsNumeric(m.s) and empty(mod(m.s, 1))

endfunc
*_______________________________________________________________________________
protected function IsNumeric(s)

  return   inlist(vartype(m.s), T_NUMERIC, T_DOUBLE, 'F''I')

endfunc
*_______________________________________________________________________________

enddefine
*===============================================================================
*===============================================================================
*===============================================================================
&& Api

*_______________________________________________________________________________
#define T_HANDLE        long
#define  LPSECURITY_ATTRIBUTES  string
#define BOOL          long
#define LPCTSTR          string @

function CreateMutex(lpMutexAttributes, bInitialOwner, lpName)


  local returnValue

  try
    declare T_HANDLE CreateMutex IN kernel32.dll ;
      LPSECURITY_ATTRIBUTES  lpMutexAttributes, ;
      BOOL bInitialOwner, ;
      LPCTSTR lpName

    returnValue = CreateMutex(m.lpMutexAttributes, m.bInitialOwner, @m.lpName)

  catch
    assert false
    returnValue = 0


  endtry

  return m.returnValue
endfunc
*_______________________________________________________________________________
function CloseHandle(handle)

  local returnValue

  try
    declare BOOL CloseHandle in Kernel32.dll ;
      T_HANDLE  handle

    returnValue = CloseHandle(m.handle)

  catch
    assert FALSE
    returnValue = 0

  endtry

  return m.returnValue

endfunc
*_______________________________________________________________________________
function GetLastError()

  local returnValue

  try
    declare integer GetLastError IN Win32API
    returnValue = GetLastError()

  catch
    assert FALSE
    returnValue = -1

  endtry

  return m.returnValue

endfunc
*_______________________________________________________________________________


endif



Permalink : http://www.atoutfox.org/nntp.asp?ID=0000010248
20 088 messages dans le forum • Liste complète des messages

Publicité

Les pubs en cours :


www.atoutfox.org - Site de la Communauté Francophone des Professionnels FoxPro - v3.4.0 - © 2004-2024.
Cette page est générée par un composant COM+ développé en Visual FoxPro 9.0-SP2-HF3