Saltar para o conteúdo principal
Versão: 20 R8 BETA

Signal

Sinais são ferramentas fornecidas pela linguagem 4D para gerenciar interações e evitar conflitos entre processos em uma aplicação multiprocesso. Sinais permitem assegurar que um ou mais processos vão esperar por uma tarefa específica a ser completada antes de continuar a execução. Qualquer processo pode esperar ou liberar um sinal.

Os semáforos podem ser usados para gerenciar interações. Semaphores allow you to make sure that two or more processes do not modify the same resource (file, record...) ao mesmo tempo. Só o processo que estabelece o semáforo pode removê-lo.

Objeto sinal

Um sinal é um objeto partilhado que deve ser passado como parâmetro a comandos que chamam ou criam trabalhadores ou processo.

Um objeto 4D.Signal contém os seguintes métodos e propriedades integrados:

Any worker/process calling the .wait() method will suspend its execution until the .signaled property is true. Enquanto espera um sinal, o processo que chamar não usa nenhuma CPU. Isso pode ser muito interessante para o rendimento nas aplicações multiprocesso. The .signaled property becomes true when any worker/process calls the .trigger() method.

Note that to avoid blocking situations, the .wait() can also return after a defined timeout has been reached.

Os objetos Signal são criados com o comando New signal.

Trabalhar com sinais

Em 4D, você cria um objeto signal chamando o comando New signal. Once created, this signal must be passed as a parameter to the New process or CALL WORKER commands so that they can modify it when they have finished the task you want to wait for.

  • signal.wait() must be called from the worker/process that needs another worker/process to finish a task in order to continue.
  • signal.trigger() must be called from the worker/process that finished its execution in order to release all others.

Once a signal has been released using a signal.trigger() call, it cannot be reused again. If you want to set another signal, you need to call the New signal command again.

Since a signal object is a shared object, you can use it to return results from called workers/processes, provided that you do not forget to write values within a Use...End use structure (see example).

Exemplo

 var $signal : 4D.Signal

// Criação de um sinal
$signal:=New signal

// chamar o processo principal e executar o método OpenForm
CALL WORKER(1;"OpenForm";$signal)
// fazer outro cálculo
...
// Esperando pelo fim do processo
$signaled:=$signal.wait()

// Processamento dos resultados
$calc:=$signal.result+...

Método OpenForm :

 #DECLARE ($signal : 4D.Signal)  
var $form : Object
$form:=New object("value";0)

// Abrir o formulário
$win:=Open form window("Information";Movable form dialog box)
DIALOG("Information";$form)
CLOSE WINDOW($win)

// Adicione um novo atributo ao seu objeto compartilhado $signal para passar seu resultado ao outro processo:
Use($signal)
$signal.result:=$form.value
End use

// Disparar o sinal para o processo de espera
$signal.trigger()

Resumo

.description : Text
contém uma descrição personalizada para o objeto Signal
.signaled : Boolean
contém o estado atual do objeto Signal
.trigger( )
define a propriedade signaled do objeto de sinal como true
.wait( { timeout : Real } ) : Boolean
faz com que o processo atual espere até que a propriedade .signaled do objeto signal se torne true ou que o timeout opcional expire

.description

História
ReleaseMudanças
17 R4Adicionado

.description : Text

Descrição

A propriedade contém uma descrição personalizada para o objeto Signal.

.description pode ser definida ao criar o objeto signal ou a qualquer momento. Note that since the Signal object is a shared object, any write-mode access to the .description property must be surrounded by a Use...End use structure.

Essa propriedade é leitura-escrita.

.signaled

História
ReleaseMudanças
17 R4Adicionado

.signaled : Boolean

Descrição

A propriedade .signaled contém o estado atual do objeto Signal. Quando o sinal é criado, .signaled é False. Torna-se True quando o .trigger( ) é chamado no objeto.

Essa propriedade é somente leitura.

.trigger()

História
ReleaseMudanças
17 R4Adicionado

.trigger( )

ParâmetroTipoDescrição
Não exige nenhum parâmetro

Descrição

A função .trigger( ) define a propriedade signaled do objeto de sinal como true e desperta todos os workers ou processos esperando por este sinal.

Se o sinal já estiver no estado de sinalização (ou seja, a propriedade signaled já for true), a função não faz nada.

.wait()

História
ReleaseMudanças
17 R4Adicionado

.wait( { timeout : Real } ) : Boolean

ParâmetroTipoDescrição
timeoutReal->Tempo máximo de espera do sinal em segundos
ResultadosParâmetros<-Estado da propriedade .signaled

Descrição

A função .wait( ) faz com que o processo atual espere até que a propriedade .signaled do objeto signal se torne true ou que o timeout opcional expire.

Para evitar o bloqueio de código, você pode passar um tempo máximo de espera em segundos no parâmetro timeout (são aceitos decimais).

Aviso: Não é recomendável chamar .wait( ) sem um timeout no processo principal do 4D, pois isso pode congelar todo o aplicativo 4D.

Se o sinal já estiver no estado de sinalização (ou seja, a propriedade .signaled já é true), a função devolve imediatamente, sem esperar.

A função retorna o valor da propriedade .signaled. A avaliação desse valor permite saber se a função retornou porque o .trigger( ) foi chamado (.signaled é true) ou se o timeout expirou (.signaled é false).

O estado de um processo que espera um signal é Waiting for internal flag.