Saltar para o conteúdo principal
Versão: 20 R6

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 de sinal são criados com o comando New signal.

Trabalhar com sinais

In 4D, you create a new signal object by calling the New signal command. 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)

// Open the form
$win:=Open form window("Information";Movable form dialog box)
DIALOG("Information";$form)
CLOSE WINDOW($win)

// Add a new attribute to your $signal shared object to pass your result to the other process:
Use($signal)
$signal.result:=$form.value
End use

// Trigger the signal to the waiting process
$signal.trigger()

Resumo

.description : Text
contains a custom description for the Signal object.
.signaled : Boolean
contains the current state of the Signal object
.trigger( )
sets the signaled property of the signal object to true
.wait( { timeout : Real } ) : Boolean
makes the current process wait until the .signaled property of the signal object to become true or the optional timeout to expire

New signal

História
ReleaseMudanças
17 R4Adicionado

New signal { ( description : Text ) } : 4D.Signal

ParâmetroTipoDescrição
descriptionText->Descrição para o sinal
Resultados4D. Signal<-Objeto nativo encapsulando o sinal

Descrição

The New signal command creates a 4D.Signal object.

Um sinal é um objeto partilhado que pode ser passado como parâmetro de um worker ou processo para outro worker ou processo, de forma que:

  • o worker/processo chamado pode atualizar o objeto sinal depois de um processamento especifico ter terminado
  • o worker/processo chamado pode parar sua execução e esperar até que o sinal seja atualizado, sem consumir qualquer recurso de CPU.

Optionally, in the description parameter you can pass a custom text describing the signal. Esse texto pode também ser definido depois da criação do sinal.

Since the signal object is a shared object, it can also be used to maintain user properties, including the .description property, by calling the Use...End use structure.

Valor retornado

Um novo objeto 4D.Signal.

Exemplo

Este é um exemplo típico de um worker que fixa um sinal:

 var $signal : 4D.Signal
$signal:=New signal("This is my first signal")

CALL WORKER("myworker";"doSomething";$signal)
$signaled:=$signal.wait(1) //wait for 1 second max

If($signaled)
ALERT("myworker finished the work. Result: "+$signal.myresult)
Else
ALERT("myworker has not finished in less than 1s")
End if

O método doSomething poderia ser como:

 #DECLARE ($signal : 4D.Signal)
//any processing
//...
Use($signal)
$signal.myresult:=$processingResult //return the result
End use
$signal.trigger() // The work is finished

.description

História
ReleaseMudanças
17 R4Adicionado

.description : Text

Descrição

The .description property contains a custom description for the Signal object..

.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

The .signaled property contains the current state of the Signal object. 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

The .trigger( ) function sets the signaled property of the signal object to true and awakens all workers or processes waiting for this signal.

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

The .wait( ) function makes the current process wait until the .signaled property of the signal object to become true or the optional timeout to expire.

To prevent blocking code, you can pass a maximum waiting time in seconds in the timeout parameter (decimals are accepted).

Aviso: a chamada a .wait( ) sem um timeout no processo principal de 4D não é recomendável porque poderia congelar toda a aplicação 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. Evaluating this value allows knowing if the function returned because the .trigger( ) has been called (.signaled is true) or if the timeout expired (.signaled is false).

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