Este é o site histórico da documentação 4D. As documentações estão sendo movidas progressivamente para developer.4d.com

Página Inicial

 
4D v19.8
Objetos compartidos e Coleções compartidas

Objetos compartidos e Coleções compartidas  


 

Os objetos compartidos e as coleções compartidas são objetos específicos e coleções cujos conteúdos são compartidos entre processos. Diferente de , os objetos compartidos e as coleções compartidas tèm a vantagem de ser compatíveis com Processos 4D Preemptivos:  podem ser passadas por referência como parâmetros a comandos como New process ou CALL WORKER.

Os objetos compartidos e as coleções compartidas podem ser armazenadas nas variáveis declaradas com os comandos padrão C_OBJECT e C_COLLECTION, mas devem ser criadas instâncias utilizando comandos específicos:

Nota: os objetos e as coleções compartidas podem ser definidas como propriedades de objetos ou coleções padrão (não compartidos).

Para modificar um objeto/coleção compartido, deve chamar à estrutura Use...End use. Ler um valor de objeto/coleção compartido não exige isso Use...End use.

Um único catálogo global devolvido pelo comando Storage sempre está disponível em todo o  banco de dados e seus componentes e pode ser usado para armazenar todos os objetos e coleções compartidos.

Quando tiver instanciado com os comandos New shared object ou New shared collection, os atributos objeto/coleção compartidos e elementos podem ser modificados ou lidos desde qualquer processo.

As modificações podem ser aplicadas a objetos compartidos e coleções compartidas:

  • agregar ou eliminar propriedades de objetos,
  • agregar ou editar valores (sempre que sejam compatíveis com objetos compartidos).

Entretanto, todas as instruções de modificação en um objeto compartido ou coleção devem estar rodeadas pelas palavras chaves Use...End use, do contrário, se gerará um erro.

 $s_obj:=New shared object("prop1";"alpha")
 Use($s_obj)
    $s_obj.prop1:="omega"
 End Use

Um objeto/coleção compartido só pode ser modificado por um processo por vez. Use bloquea o objeto/coleção compartido de outros fios (threads),enquanto que o último End use desbloqueia todos os objetos e coleções compartilhados (se o contador de bloqueio estiver em 0, ver abaixo). Tentar modificar um objeto/coleção compartido sem ao menos um Use...End use gera um erro.  Quando um processo chama a Use...End use em um objeto/coleção compartilhado que já está sendo utilizado por outro processo, simplesmente fica em espera até que  End use o desbloqueia (não é gerado nenhum erro). Em consequência, as instruções dentro das estruturas Use...End use devem ser executadas rapidamente e bloquear os elementos tão rápido quanto possível. Portanto, se recomenda encarecidamente evitar a modificação de um objeto ou coleção compartilhado diretamente desde a interface, por exemplo, através de um quadro de diálogo.

A atribuição de objetos/coleções compartilhadas a propriedades ou elementos de outros objetos compartilhados / coleções está permitida e cria grupos compartilhados. Um grupo compartilhado é criado automaticamente quando um objeto compartilhado/coleção é estabelecido em um valor de propriedade ou um objeto compartilhado. Os grupos compartilhados permitem aninhar objetos e coleções compartidos mas devem ser seguidas régras adicionais:

   

  • A chamada de Use com um objeto/coleção compartilhado de um grupo provocará o bloqueio das propriedades/elementos de todos os objetos/coleções do grupo e incrementa o contador de bloqueio. Chamar End Use diminui o contador de bloquieo do grupo e quando o contador estiver em 0, se desbloqueiam todos os objetos ou coleções compartilhados vinculados.
  • O objeto/coleção compartilhado só pode pertencer a um grupo compartilhado. É devolvido um erro se quiser configurar um objeto/coleção compartilhado já agrupados em um grupo diferente.
  • Os objetos/coleções compartilhadas agrupadas não podem ser desagrupadas. Quando tiver sido incluído em um grupo compartilhado, um objeto compartilhado, mnesmo se forem eliminados do objeto / coleção pai,  permanecerão vinculados.

    Consulte o exemplo 2 para ver una ilustração das regras de grupo compartilhadas.

    Nota: os grupos compartilhados são administrados através de uma propriedade interna chamada locking identifier. Para obter informação detalhada sobre este valor, consulte a seção avançada Identificador de bloqueio (Locking identifier) a seguir.
Leitura  

A leitura de propriedades ou elementos de um objeto/coleção compartido está permitida sem ter que chamar a estructura Use...End use, mesmo se o objeto/colecção compartido estiver sendo utilizado por outro processo.

Entretanto, é necessário ler um objeto/coleção compartido dentro de Use...End use quando vários valores são vinculados entre si e devem ser llidos por vez, por razões de coerência.

Como padrão, chamar  OB Copy/collection.copy( ) com um objeto compartido/coleção (ou que contém objetos compartidos/coleções) vai retornar um objeto/coleção (não compartilhado) incluindo seus  objetos contidos (se houver) .

Entretanto, pode usar o parâmetro ck shared option com estes comandos para produzir uma cópia compartilhada do objeto/coleção fonte.

 

Storage  

Storage é um objeto compartido único, disponível automaticamente em cada aplicação e máquina. Este objeto compartido é devolvido pelo comando Storage. Está criado para fazer referência a todos os objetos/coleções compartidos definidos durante a sesão, de modo que possam ser usados desde qualquer processo preemptivo ou padrão.

Lembre que,  diferente dos objetos compartidos padrão, o objeto de armazenamento não comparte seu identificador de bloqueio com os objetos agregados como suas propriedades. Esta exceção permite que o objeto de armazenamento se usa sem bloquear todos os objetos compartidos conectados.

Para saber mais, consulte Storage.

Se quiser iniciar vários processos que realizam uma tarefa de inventário en diferentes produtos e atualizar o mesmo objeto compartido. O processo principal exemplifica um objeto compartido vazio e depois inicia os outros processos, passando o objeto compartido e os produtos para contar como parametros:

 ARRAY TEXT($_items;0)
 ... //preenche o array com itens para contar
 $nbItems:=Size of array($_items)
 C_OBJECT($inventory)
 $inventory:=New shared object
 Use($inventory)
    $inventory.nbItems:=$nbItems
 End use
 
  //Criar processos
 For($i;1;$nbItems)
    $ps:=New process("HowMany";0;"HowMany_"+$_items{$i};$_items{$i};$inventory)
  //$inventory object enviado por referencia
 End for

No método "HowMany", foi feito o  inventário e o objeto compartido $inventory se atualiza logo que possível:

 C_TEXT($1)
 C_TEXT($what)
 C_OBJECT($2)
 C_OBJECT($inventory)
 $what:=$1 //para facilitar a leitura
 $inventory:=$2
 
 $count:=CountMethod($what//método para contar produtos
 Use($inventory//utilizar objeto compartido
    $inventory[$what]:=$count  //salvar os resultados para este elemento
 End use

Os exemplos abaixo destacam regras específicas quando lidar com shared groups (grupos compartilhados):

 $ob1:=New shared object
 $ob2:=New shared object
 Use($ob1)
    $ob1.a:=$ob2  //grupo 1 foi criado
 End use
 
 $ob3:=New shared object
 $ob4:=New shared object
 Use($ob3)
    $ob3.a:=$ob4  //grupo 2 foi criado
 End use
 
 Use($ob1//usa um objeto do grupo 1
    $ob1.b:=$ob4  //ERROR
  //$ob4 já pertence a outro grupo
  //atribuição não é permitida
 End use
 
 Use($ob3)
    $ob3.a:=Null //remove qualquer referência a  $ob4 do grupo 2
 End use
 
 Use($ob1//usa um objeto do grupo  1
    $ob1.b:=$ob4  //ERROR
  //$ob4 ainda pertence ao grupo  2
  //atribuição não é permitida
 End use

Cada novo objeto/ coleção compartido  é criado com um identificador de bloqueio único (um valor inteiro longo). O estado inicial do identificador de bloqueio é sempre positivo,  o que significa que o objeto/coleção é "único". Quando um objeto/coleção compartido com um estado "único" se estabelece como uma propriedade ou elemento de outro objeto/coleção compartido, ambos são convertidos em "múltiplos". Todos os objetos/coleções conectados compartem o mesmo identificador de bloqueio (as propriedades/elementos agregados herdam o identificador de bloqueio de objeto/coleção pai) e o valor do identificador de bloqueio vira negativo

Quando se elimina um objeto/coleção compartido de seu objeto/coleção pai:

  • ainda se consideram como "múltiplos"
  • mantêm o mesmo identificador de bloqueio.

As regras são aplicadas ao estabelecer objetos/coleções compartidos como propriedades ou elementos a outros objetos/coleções compartidos:

  • um objeto/coleção "único"  pode ser unido a outro objeto/coleção "único" ou "múltiplo",
  • um objeto/coleção "múltiplo" pode ser unido a outro objeto/ coleção "múltiplo" que tenha o mesmo identificador de bloqueio,
  • um erro é produzido se tentar  adjuntar um objeto/coleção "múltiplo" a outro objeto/coleção "único" ou "múltiplo" que não tenha o mesmo identificador de bloqueio.

Estas regras são ilustradas nos gráficos abaixo:

  1. Os objetos compartidos e as coleções compartidas (A, B, C, D) são criadas com um "identificador de bloqueio" interno e único (1, 2, 3, 4).
  2. Quando fizer referência a um único objeto (A) dentro de outro objeto único (B), ambos viram múltiplos e compartem o mesmo identificador de bloqueio. Podem ser agregados objetos individuais adicionais a (A)  seja ao lado ou dentro de (B). Todos os objetos são considerados múltiplos e compartem o mesmo identificador de bloqueio.
  3. Quando um objeto múltiplo (B) é eliminado (desreferência) de outro objeto múltiplo (A), ambos permanecem múltiplos e continuam conservando e compartindo o mesmo identificador de bloqueio
  4. Os objetos múltiplos (A, B) não podem ser usados como propriedades de um só objeto (D), enquanto que os objetos individuais (C) possam ser usados.
  5. Vários objetos (A, B) podem ser usados como propriedades de objeto (D) se compartirem o mesmo identificador de bloqueio. Os objetos individuais (C) também  podem ser usados.

O identificador de bloqueio de objetos e coleções compartidos são mostrados no depurador como a propriedad privada __LockerID. Pode mostrar o tipo de "Objeto compartido" no depurador selecionando Mostrar tipos no menu contextual do depurador:

Lembre que os objetos compartidos e as coleções podem ser ingressadas no depurador, sempre que não se "usem" em nenhum outro lugar, em cujo caso não podem ser modificados.



Ver também 

collection.copy( )
New shared collection
New shared object
OB Copy
Storage

 
PROPRIEDADES 

Produto: 4D
Tema: Objetos (Linguagem)

 
CONTEÚDO DA PÁGINA 
 
HISTÓRIA 

Criado por: 4D v16 R6

 
ARTICLE USAGE

Manual de linguagem 4D ( 4D v19)
Manual de linguagem 4D ( 4D v19.1)
Manual de linguagem 4D ( 4D v19.4)
Manual de linguagem 4D ( 4D v19.5)
Manual de linguagem 4D ( 4D v19.6)
Manual de linguagem 4D ( 4D v19.7)
Manual de linguagem 4D ( 4D v19.8)