Árvore de páginas

Você está vendo a versão antiga da página. Ver a versão atual.

Comparar com o atual Ver Histórico da Página

« Anterior Versão 4 Próxima »

Função: IPCWaitEx

Coloca em modo de espera a thread em execução, criando um semáforo nomeado, e aguarda por um determinado período pela liberação desse semáforo.

A liberação do semáforo pode ocorrer por time-out, ou através da chamada da função IPCGo() por outro processo, utilizando como parâmetro o nome do semáforo nomeado criado pela IPCWaitEx(). Além disso, a liberação semáforo pela função IPCGo() pode enviar parâmetros adicionais, recuperados pela função IPCWaitEx().

IPCWaitEx ( < cSemaforo>, < nTimeOut> ) --> lRet

 

NomeTipoDescriçãoObrigatórioReferência
cSemaforoCaracterIndica o nome do semáforo que estamos trabalhando. Observação: O nome do semáforo não pode conter letras minúsculas. Todas as letras devem ser maiúsculas.X 
nTimeOutNuméricoIndica o tempo de time-out em milisegundos para a thread sair do ar.X 

 

lRet
    (logico)
  • Retorna verdadeiro (.T.), se receber uma chamada da função IPCGo(); caso contrário, falso (.F.), se não receber chamada ou sair por time-out.
  • É importante que o semáforo seja preenchido com letras maiúsculas.
  • Essa função recebe até 15 argumentos opcionais, por referência, que permitem recuperar os parâmetros opcionais passados na chamada da função IPCGo().
  • A função recebe como segundo parâmetro <nTimeOut>, em milissegundos, que estabelece quanto tempo o processo atual permanecerá em modo de espera, aguardando pela liberação do semáforo através da IPCGo().
  • Se, no tempo estabelecido, o semáforo não for liberado explicitamente através da IPCGo(), o semáforo é liberado por time-out, a função rertorna falso (.F.), e o fluxo de execução do programa continua.
  • Observe que foi indicado um valor de semáforo para a função.

 

Detalhes para o teste do código-fonte exemplo

  • Execute a função u_IPCLe() que iniciará o IPC e o colocará em espera.
  • Execute a função u_IpcGrava() que trocará informações entre os IPCs.
#INCLUDE "TOTVS.CH"
#DEFINE SEMAFORO 'IDUNICOTESTE' // Semáforo para teste
// Inicia programa para teste do IPC
User Function IPCLe()
MsgRun("Teste de IPCWaitEX","Esperando ... ",{|| IPCLE() } )
Return
// ---------------------------------------------------------------------------
// Função prepara o IPC para ser utilizado
// ---------------------------------------------------------------------------
STATIC function IPCLE()
Local cPar := '' , lRec
conout('Iniciando...')
While !killapp()
// Espera por 5 segundos ...
lRec := IpcWaitEx(SEMAFORO,5000,@cPar)
// Se recebeu chamada via IPC
If lRec
MsgStop(cPar,"Mensagem Recebida...")
exit
Else
conout("Esperando...")
Endif
Enddo
Conout('Finalizando...')
Return
// ---------------------------------------------------------------------------
// Função enviará dados para o IPC, trocando informações entre as Threads
// ---------------------------------------------------------------------------
User Function IpcGrava()
Local lGoOk := .F.
Local cEcho,nFree := IpcCount(SEMAFORO)
cEcho := "IPCs em Espera : "+str(nFree,4)+CRLF
// Envia dados via IPC entre as Threads
lGoOk := IpcGo( SEMAFORO, "Enviando dados via IPC - a hora é: " + time() )
If lGoOk
cEcho += "Hora atual enviada para " +SEMAFORO
Else
cEcho += "Nao foi possível enviar a hora atual para " +SEMAFORO
Endif
MsgStop(cEcho)
Return
Protheus 10 , TOTVS Application Server 10 , ByYou Application Server

 

  • Sem rótulos