Página 1 de 1

STATIC e THREAD STATIC

Enviado: 14 Set 2016 18:02
por asimoes
Pessoal,

Qual é a diferença entre STATIC e THREAD STATIC

STATIC e THREAD STATIC

Enviado: 18 Out 2016 11:40
por NiltonGM
E eu nem sabia que existia "THREAD STATIC", agora fiquei curioso... :-o

STATIC e THREAD STATIC

Enviado: 18 Out 2016 13:57
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.

STATIC e THREAD STATIC

Enviado: 18 Out 2016 14:38
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?

STATIC e THREAD STATIC

Enviado: 18 Out 2016 18:23
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.

STATIC e THREAD STATIC

Enviado: 18 Out 2016 18:36
por JoséQuintas
Por falar nisso, se for fazer gets em multithread, e tiver getsys pessoal, é obrigatório usar isso na Getsys.

STATIC e THREAD STATIC

Enviado: 19 Out 2016 11:45
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