STATIC e THREAD STATIC

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

STATIC e THREAD STATIC

Mensagem por asimoes »

Pessoal,

Qual é a diferença entre STATIC e THREAD STATIC
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
NiltonGM
Usuário Nível 3
Usuário Nível 3
Mensagens: 397
Registrado em: 05 Jun 2014 23:47
Localização: Caieiras/SP

STATIC e THREAD STATIC

Mensagem por NiltonGM »

E eu nem sabia que existia "THREAD STATIC", agora fiquei curioso... :-o
Nilton Medeiros
nilton@sistrom.com.br
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

STATIC e THREAD STATIC

Mensagem por JoséQuintas »

Deixou passar... rs

https://pctoledo.org/forum/viewto ... ic#p102606

THREAD STATIC é o mesmo que STATIC, mas restrito à thread.

STATIC Conexao -> Ao usar várias threads, Conexao vai ser a mesma pra todas as threads
THREAD STATIC Conexao -> Cada thread vai ter sua própria conexao

Supondo que vai rodar varias rotinas de enviar email em background e em multithread, que usam uma determinada variável STATIC.
Deixando como THREAD STATIC uma não interfere na outra.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

STATIC e THREAD STATIC

Mensagem por asimoes »

Quintas,

Deixa eu ver se eu entendi.

Tenho uma rotina de Email

Nela eu tenho :

THREAD STATIC cConexao

Se eu chamar

hb_ThreadStart( HB_BITOR( HB_THREAD_INHERIT_PUBLIC, HB_THREAD_INHERIT_PRIVATE, HB_THREAD_INHERIT_MEMVARS ), @Email() )

hb_ThreadStart( HB_BITOR( HB_THREAD_INHERIT_PUBLIC, HB_THREAD_INHERIT_PRIVATE, HB_THREAD_INHERIT_MEMVARS ), @Email() )

cConexao em cada chamada vai ter valor diferente?
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

STATIC e THREAD STATIC

Mensagem por JoséQuintas »

Isso.

Outro exemplo, eu tenho uma "pilha" de save screen/restore screen, um array

Código: Selecionar todos

STATIC wTelas := {}
Posso ir salvando/restaurando com wSave() e wRestore(), que apenas vão adicionando/retirando elementos do array.

Em multithread, impossível, porque não segue a ordem, qualquer janela pode salvar/restaurar, e a ordem não será mais a mesma.

Ao invés de complicar, o que eu fiz:

Código: Selecionar todos

THREAD STATIC wTelas := {}
Pronto, cada módulo tem sua pilha particular de telas pra salvar/restaurar.
Melhor do que qualquer rotina complexa.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

STATIC e THREAD STATIC

Mensagem por JoséQuintas »

Por falar nisso, se for fazer gets em multithread, e tiver getsys pessoal, é obrigatório usar isso na Getsys.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

STATIC e THREAD STATIC

Mensagem por asimoes »

Brincando com THREAD STATIC e além

Exemplo usando hb_Idle, getList e THREAD STATIC
Pode ser útil para alguém.

Código: Selecionar todos

FUNCTION MAIN
LOCAL cTeste1:=Space(8), cTeste2:=Space(8), cTeste3:=Space(8)
   
   oInatividade := ClInatividade():New()
   oInatividade:Start( .T., 5, {|| Put( Time() )}, "A")
  
   @ 05,00 GET cTeste1
   @ 06,00 GET cTeste2 WHEN {|| oInatividade:End("A") }
   @ 07,00 GET cTeste3 WHEN {|| oInatividade:Start( .T., 30, {|| Put( Time() )}, "A") }
   READ
   
RETURN Nil

FUNCTION Put( cVar )
LOCAL nRow, nCol, oElemento

   nRow:=Row()
   nCol:=Col()
   
   FOR EACH oElemento IN GetList
      WITH Object oElemento
         IF :name = "cTeste3"
            :Varput( cVar )
            :UpdateBuffer()
            :Display() 
         ENDIF
      END
   NEXT
   SETCURSOR(1)
   SetPos(nRow, nCol)
   
RETURN Nil

#pragma BEGINDUMP

#include "windows.h"
#include "time.h"
#include "hbapi.h"

HB_FUNC( PEGAINATIVIDADE ) 
{
   LASTINPUTINFO lpi;
   lpi.cbSize = sizeof (LASTINPUTINFO);
   GetLastInputInfo (&lpi);
   hb_retnd( ( DOUBLE ) ( GetTickCount() - lpi.dwTime ) / CLOCKS_PER_SEC ); 
}

#pragma ENDDUMP 

Código: Selecionar todos


*****************************************************
* Função para verificar ociosidade de teclado e mouse
* executa um bloco de função/procedure
* ---------------------------------------------------
* Autor : Alexandre Simões
* Data  : 13/10/2016
* Versão: 1.1
*****************************************************
#include "hbclass.ch"

THREAD STATIC nIdleTimeInatividade
THREAD STATIC aIdle:={}

CREATE CLASS ClInatividade

   METHOD Start( lInicio, nTempo, bBloco, cIdentificador )
   METHOD End( cIdentificador )
   METHOD Inatividade( nTempo, nIdleTimeInatividade, bBloco )
   
   ENDCLASS
   
METHOD Start( lInicio, nTempo, bBloco, cIdentificador ) CLASS ClInatividade
LOCAL oElemento

   hb_Default(@lInicio, .T.)
   hb_Default(@nTempo, 10)
   hb_Default(@bBloco, {|| lInicio:=lInicio })
   hb_Default(@cIdentificador, "A")
   
   IF lInicio
      nIdleTimeInatividade := hb_IdleAdd( {|| ::Inatividade( nTempo, nIdleTimeInatividade, bBloco ) } )
      aAdd( aIdle, {nIdleTimeInatividade, cIdentificador} )
   ELSE
      ::End( cIdentificador )
   ENDIF
   
RETURN .T.  

METHOD End( cIdentificador ) CLASS ClInatividade
LOCAL oElemento

   hb_Default(@cIdentificador, "T")
   
   FOR EACH oElemento IN aIdle
      IF cIdentificador = "T"
         IF oElemento[1] != Nil
            hb_IdleDel( oElemento[1] )
         ENDIF
      ELSE
         IF oElemento[1] != Nil .AND. oElemento[2] = cIdentificador 
            hb_IdleDel( oElemento[1] )
         ENDIF
      ENDIF
   NEXT
   
   IF cIdentificador = "T"
      aIdle := {}
   ELSE
      FOR EACH oElemento IN aIdle
         IF oElemento[1] != Nil .AND. oElemento[2] = cIdentificador 
            hb_IdleDel( oElemento[1] )
            hb_ADel( aIdle, oElemento:__enumIndex() , .T. )
         ENDIF
      NEXT   
   ENDIF

RETURN .T.

METHOD Inatividade( nTempo, nIdleTimeInatividade, bBloco ) CLASS ClInatividade

   IF Round(PegaInatividade(),0) >= nTempo .AND. ValType( bBloco ) = "B"
      hb_IdleReset( nIdleTimeInatividade )
      Eval ( bBloco )
   ENDIF
   hwg_DoEvents()
   hb_IdleSleep( 0 )
   
RETURN Nil
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Responder