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().
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
Nome | Tipo | Descrição | Obrigatório | Referência |
cSemaforo | Caracter | Indica 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 | |
nTimeOut | Numérico | Indica 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 IPCUser Function IPCLe() MsgRun("Teste de IPCWaitEX","Esperando ... ",{|| IPCLE() } )Return// ---------------------------------------------------------------------------// Função prepara o IPC para ser utilizado// ---------------------------------------------------------------------------STATIC function IPCLE()Local cPar := '' , lRecconout('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 EnddoConout('Finalizando...')Return // ---------------------------------------------------------------------------// Função enviará dados para o IPC, trocando informações entre as Threads// ---------------------------------------------------------------------------User Function IpcGrava()Local lGoOk := .F.Local cEchonFree := IpcCount(SEMAFORO)cEcho := "IPCs em Espera : "+str(nFree,4)+CRLF// Envia dados via IPC entre as ThreadslGoOk := IpcGo( SEMAFORO, "Enviando dados via IPC - a hora é: " + time() )If lGoOk cEcho += "Hora atual enviada para " +SEMAFOROElse cEcho += "Nao foi possível enviar a hora atual para " +SEMAFOROEndifMsgStop(cEcho)Return
Protheus 10
,
TOTVS Application Server 10
,
ByYou Application Server
Visão Geral
Import HTML Content
Conteúdo das Ferramentas
Tarefas