THREAD STATIC como reiniciar ?

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

THREAD STATIC como reiniciar ?

Mensagem por asimoes »

Pessoal,

Deve ser coisa boba, mas como resolvo isso ?

Tenho uma rotina que utilizei um contador de página com a instrução abaixo:

THREAD STATIC nPag := 1
...
nPag ++

Acontece que se a rotina for executado novamente o contador de página não inicia com 1, como faço para reiniciar o contador da 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
janio
Colaborador
Colaborador
Mensagens: 1846
Registrado em: 06 Jul 2004 07:43
Localização: UBAJARA - CE

THREAD STATIC como reiniciar ?

Mensagem por janio »

Variável STATIC somente eh criada se ainda não existir?

Se já existir ele assume o último valor nenao? Por isso q quando executado novamente ele não inicia em 1

Pq ao final vc não 'zera' a variável novamente?

THREAD STATIC nPag := 1
...
nPag ++
...
...
...
nPag := 1
fui...
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

THREAD STATIC como reiniciar ?

Mensagem por asimoes »

Janio,

Fiz uma solução meia boca até achar algo mais funcional

ContadorPagina( .T. ) // Força inicio do contador
...
F_CABEC()

Código: Selecionar todos

STATIC FUNCTION F_CABEC()

   nPag := ContadorPagina() // Recebe contador

   @ 1,2 SAY "SECRETARIA MUNICIPAL DE FAZENDA"
   @ 2,2 SAY "DIRETORIA DE ADMINISTRAۂO / DEPARTAMENTO DE RECURSOS HUMANOS"
   @ 3,0 SAY PADL( "Data   : " + Hb_DtoC( Date(), "DD/MM/YYYY"), 204 )
   @ 4,0 SAY PADL( "P gina : " + StrZero( nPag, 4 ) + Space(6), 204 )
   @ 5,0 SAY PADL( "Rotina : " + StrZero( GROTINA, 4 ) + Space(6), 204 )
   @ 6,1 SAY PADC( "*** RELATàRIO DE FUNCIONµRIOS POR LOTA€ÇO, FORMA€ÇO E NOME  ***", 204 )
   @ 7,0 SAY Replicate( "-", 204 )
 RETURN Nil

Código: Selecionar todos

FUNCTION ContadorPagina( lStart )
THREAD STATIC nPag := 0

   hb_Default(@lStart, .F. )
   
   IF lStart
      nPag := 0
   ELSE
      nPag ++
   ENDIF

RETURN nPag
►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: 20420
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

THREAD STATIC como reiniciar ?

Mensagem por JoséQuintas »

Se complicou... algo está errado.
Pra mim, parece um mau uso de recursos.

À primeira vista é um único relatório, criar variável por thread pra um único relatório... desperdício e complicação.
O aplicativo vai reservar uma parte da memória pra que essa variável esteja sempre disponível, e lembrar do valor anterior.
Se cada vez que emite o relatório começa na página 1, precisa lembrar pra que?

Se for mais de um relatório... piorou... cada relatório vai ter sua própria numeração, e um vai atrapalhar o outro.

Vamos lá:
Se isso é rotina de cabeçalho, provavelmente também tem controle de linhas no outro fonte que vai chamar esse cabeçalho.

Ou cria uma classe (se forem vários relatórios), ou usa variável local e controla página no outro fonte.
Exemplo:

Código: Selecionar todos

nPag := 0
nLin := 66
DO WHILE ! Eof()
   IF nLin > 64
     Cabecalho( @Pag )
   ENDIF
ENDDO
...

FUNCTION Cabecalho( nPag )
  @ 0, 0 SAY ++nPag
   RETURN NIL
Sua inicialização de STATIC corresponde a npag := 0
À primeira vista, o mesmo trabalho com variáveis locais, que serão destruídas assim que não forem mais necessárias.

Nota: Também poderia ser Cabecalho( ++nPag ), mas por referência ainda economiza o espaço de uma variável na rotina, e uma tecla na digitação... rs
José M. C. Quintas
Harbour 3.2, mingw, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (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

THREAD STATIC como reiniciar ?

Mensagem por asimoes »

Não Quintas,

Não é um único relatório, enfim.... diz ai a solução !

Dessa forma que você postou eu já faço desde o clipper summer, enfim não sou especialista em recursos do harbour mas sabendo que existe thread static, eu só queria saber como reiniciar o contador, só isso !
►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: 20420
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

THREAD STATIC como reiniciar ?

Mensagem por JoséQuintas »

Não é um único relatório, enfim.... diz ai a solução
Não reparei antes, provavelmente deve ser uma opção com vários relatórios.
Se é STATIC, só é visível nesse fonte.

Código: Selecionar todos

STATIC FUNCTION F_CABEC()
Não existe uma solução que sirva pra todas as situações.
Vai depender do conjunto.
Classe vai ter o mesmo inconveniente de variável PRIVATE, só compensa usar classe se isso agrupar solução pra vários relatórios.
No geral, variável local seria a mais interessante, passando a variável por referência entre as sub-rotinas.

A variável PRIVATE, quando está relacionada a um único módulo, não causa efeitos colaterais, porque fica presa àquele fonte.
Acaba sendo o mesmo de usar uma classe, talvez até mais seguro do que classe.
Só declarar MEMVAR variável no topo do arquivo PRG, e PRIVATE variável no início do relatório.
Vai passar pela compilação -w3 -es2 sem problemas.
E se rodar em threads diferentes ou em janelas diferentes, um relatório não interfere no outro.

Mas tudo depende do conjunto, e do gosto pessoal.
No final o importante é que o relatório funcione.
José M. C. Quintas
Harbour 3.2, mingw, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (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/
Responder