Clipper On Line • Ver Tópico - Hb_IdleAdd x HwGui

Hb_IdleAdd x HwGui

Projeto HwGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

 

Hb_IdleAdd x HwGui

Mensagempor asimoes » 08 Jan 2018 21:14

Pessoal,

Tenho uma janela que queria usar Hb_IdleAdd() e não funciona, alguém sabe o porque ?

Att.
►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 de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 3645
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 205 vezes
Mens.Curtidas: 154 vezes

Hb_IdleAdd x HwGui

Mensagempor Claudio Soto » 08 Jan 2018 21:27

Saludos.
Dr. Claudio Soto
(Uruguay)
http://srvet.blogspot.com
Avatar de usuário

Claudio Soto
Colaborador

Colaborador
 
Mensagens: 441
Data de registro: 27 Ago 2012 12:31
Cidade/Estado: Uruguay
Curtiu: 32 vezes
Mens.Curtidas: 131 vezes

Hb_IdleAdd x HwGui

Mensagempor sygecom » 08 Jan 2018 21:33

Chefe,
Na Hwgui uso SET TIMER, será que não resolve ?

SET TIMER oTime OF oTelaPrincipal ID 9001 VALUE 5000 ACTION {|| SUA_ROTINA() } // roda a cada 5 segundos

FUNCTION SUA_ROTINA()

oTelaPrincipal:oTime := 0 // para o TIMER pra não acavalar uma execução em cima da outra
....
....
....
oTelaPrincipal:oTime := 5000 // recomeça o TIMER

RETURN(.T.)
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
leonardodemachado@hotmail.com
Avatar de usuário

sygecom
Membro Master

Membro Master
 
Mensagens: 6509
Data de registro: 21 Jul 2006 10:12
Cidade/Estado: Alvorada-RS
Curtiu: 1 vez
Mens.Curtidas: 49 vezes

Hb_IdleAdd x HwGui

Mensagempor Claudio Soto » 08 Jan 2018 22:08

La diferencia entre un Timer y un idle, es que el primero se ejecuta a un intervalo determinado siempre y cuando el SO no este ejecutando otra tarea, los timers son de baja prioridad para Windows, y el idle se ejecuta cuando el SO esta ocioso, es decir cuando el lazo de mensajes de Windows no esta recibiendo ni procesando ningún mensaje, se utilizan típicamente para hacer tareas en background para tratar de interferir lo menos posible con la ejecucion de la aplicación, esto se utiliza mucho en aplicaciones que requieren mucha velocidad como por ej el desarrollo de juegos y animaciones gráficas
Saludos.
Dr. Claudio Soto
(Uruguay)
http://srvet.blogspot.com
Avatar de usuário

Claudio Soto
Colaborador

Colaborador
 
Mensagens: 441
Data de registro: 27 Ago 2012 12:31
Cidade/Estado: Uruguay
Curtiu: 32 vezes
Mens.Curtidas: 131 vezes

Hb_IdleAdd x HwGui

Mensagempor JoséQuintas » 08 Jan 2018 22:11

Nessas horas que a multithread é interessante: executa mais de uma tarefa e pronto.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 9089
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 6 vezes
Mens.Curtidas: 526 vezes

Hb_IdleAdd x HwGui

Mensagempor asimoes » 08 Jan 2018 22:35

Leonardo,

Eu poderia utilizar o SET TIMER, o que não estou entendendo é o Hb_IdleAdd não funcionar em uma janela HwGui, em uma janela GTXXX funciona.

Eu tenho um sistema que estou migrando aos poucos, a coisa se inverteu, antes era GTWVT agora é HwGui e ainda tem algumas telas GTWVT, no meu programa prinicipal (FUNCTION MAIN) legado da janela GTWVT uso Hb_IdelAdd e estava achando que tava funcionando e não está. Esse idle verifica de tempos em tempos se a conexão de rede está ativa entre outras coisas.
►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 de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 3645
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 205 vezes
Mens.Curtidas: 154 vezes

Hb_IdleAdd x HwGui

Mensagempor sygecom » 08 Jan 2018 22:58

Claudio Soto escreveu:La diferencia entre un Timer y un idle, es que el primero se ejecuta a un intervalo determinado siempre y cuando el SO no este ejecutando otra tarea, los timers son de baja prioridad para Windows, y el idle se ejecuta cuando el SO esta ocioso, es decir cuando el lazo de mensajes de Windows no esta recibiendo ni procesando ningún mensaje, se utilizan típicamente para hacer tareas en background para tratar de interferir lo menos posible con la ejecucion de la aplicación, esto se utiliza mucho en aplicaciones que requieren mucha velocidad como por ej el desarrollo de juegos y animaciones gráficas

Faz sentido, tem objetivos diferentes.

asimoes escreveu:Leonardo,

Eu poderia utilizar o SET TIMER, o que não estou entendendo é o Hb_IdleAdd não funcionar em uma janela HwGui, em uma janela GTXXX funciona.

Eu tenho um sistema que estou migrando aos poucos, a coisa se inverteu, antes era GTWVT agora é HwGui e ainda tem algumas telas GTWVT, no meu programa prinicipal (FUNCTION MAIN) legado da janela GTWVT uso Hb_IdelAdd e estava achando que tava funcionando e não está. Esse idle verifica de tempos em tempos se a conexão de rede está ativa entre outras coisas.


Não uso ela, mas olhando o tópico abaixo vi que tem um SET, tens ele ai ?
SET BACKGROUND TASKS ON
viewtopic.php?f=4&t=9969&p=57197&hilit=ocioso#p57197
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
leonardodemachado@hotmail.com
Avatar de usuário

sygecom
Membro Master

Membro Master
 
Mensagens: 6509
Data de registro: 21 Jul 2006 10:12
Cidade/Estado: Alvorada-RS
Curtiu: 1 vez
Mens.Curtidas: 49 vezes

Hb_IdleAdd x HwGui

Mensagempor asimoes » 08 Jan 2018 23:01

Estou me adaptando aos novos conceitos de Janela por evento, então para substituir o Hb_IdleAdd

METHOD Liga_Timer( oJanela, lLiga, nTime, bBlock, oTimer ) 

   IF lLiga
      SET TIMER &oTimer of oJanela VALUE nTime * 1000 ACTION bBlock
   ELSE
      oJanela:&oTimer:End()   
   ENDIF
   
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)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 3645
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 205 vezes
Mens.Curtidas: 154 vezes

Hb_IdleAdd x HwGui

Mensagempor Claudio Soto » 09 Jan 2018 01:07

asimoes escreveu:Eu poderia utilizar o SET TIMER, o que não estou entendendo é o Hb_IdleAdd não funcionar em uma janela HwGui, em uma janela GTXXX funciona.


Tal vez el problema se deba a que Hb ha implementado debido a su MV algunos conceptos convencionales (ej. Thread, Idle, etc ) de una forma un tanto particular que no sigue el estándar de los SO y es por eso que a veces no funciona de la forma que se espera cuando se trabaja con lib o funciones basadas en los SO. Hwg y las otras lib estan escritas de una forma que se ajustan a la funcionalidad del SO. Y esto se debe básicamente a dos cosas 1) que nacieron prácticamente al mismo tiempo que Hb cuando este sólo era practicamente un puñado de funciones de clipper totalmente orientado a consola y a manejar dbf (Hb nace en el 99 y las lib entre el 2001 y 2002) y 2) porque la única forma de sacarle el 100% de provecho a un SO es utilizarlo a nuestro favor y adaptarnos nosotras al SO y no a la inversa más ahun en un sistema basado en gráficos que necesita un muy buen rendimiento porque de por si los gráficos son lentos y si nos situamos a inicios del 2000 eran una carreta.

Si me preguntan porque creo que Hb ha implementado y sigue implementando cosas a su manera, desde mi humilde punto de vista es porque Hb se empecina a seguir implantando cosas al estilo DOS donde todo hera secuencial y lineal, esta es una solución muy sencilla para mantener en hb a los viejos Clipperos pero a su vez es una forma muy eficiente de no atraer a gente nueva, porque hay que desaprender un monton de cosas para poder adaptarse a Hb. Por ej como se le hace entender a alguien que conosca algo de Windows o Linux que en Hb los thread en realidad son thread pero que se comportan como si fuesen instancias diferentes del mismo programa, por qué un idle de Hb se refiere a la MV y no al idle del SO, como es que una clase no es una class y si una emulación visible (aunque muy ingeniosa) mediante funciones y por lo tanto no siempre se comporta como se espera en la teoría de clases, etc, etc
Saludos.
Dr. Claudio Soto
(Uruguay)
http://srvet.blogspot.com
Avatar de usuário

Claudio Soto
Colaborador

Colaborador
 
Mensagens: 441
Data de registro: 27 Ago 2012 12:31
Cidade/Estado: Uruguay
Curtiu: 32 vezes
Mens.Curtidas: 131 vezes

Hb_IdleAdd x HwGui

Mensagempor asimoes » 09 Jan 2018 07:07

Completando o que eu fiz:

Hb_ThreadStart() funciona neste caso.

::nTmpSistema := 300 // Verifica a cada 5 minutos

::Liga_Timer( oWin, .T., ::nTmpSistema, { || ::CheckLiveNet( oWin ) }, "oTimer" ) // USA O OBJETO SET TIMER

METHOD CheckLiveNet( oWin )
LOCAL hEstacaoCobranca, cEstacaoCobranca

   ::Liga_Timer( oWin, .F.,,,"oTimer" )
   
   IF nTempoUltimaVerificacaoSistema = Nil
      nTempoUltimaVerificacaoSistema := Seconds()
   ENDIF
   
   IF Seconds() - nTempoUltimaVerificacaoSistema >= ::nTmpSistema
      nThread :=  Hb_ThreadStart( Hb_BITOR( HB_THREAD_INHERIT_PUBLIC, HB_THREAD_INHERIT_PRIVATE, HB_THREAD_INHERIT_MEMVARS ), {|| ::NetWork() } )
      ::WaitThread( nThread )     
nTempoUltimaVerificacaoSistema := Seconds()
   ENDIF
   
   hwg_WriteStatus( ThisFormMain, 1, Time() )
   
   hwg_ProcessMessage()
   
   ::Liga_Timer( oWin, .T., ::nTmpSistema, { || ::CheckLiveNet( oWin ) }, "oTimer" )
   
RETURN Nil

METHOD WaitThread( nThread )

   DO WHILE .T.
      IF hb_ThreadWait( nThread, 0.1, .T. ) == 1
         EXIT
      ENDIF
      hwg_ProcessMessage()
   ENDDO
   
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)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 3645
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 205 vezes
Mens.Curtidas: 154 vezes

Hb_IdleAdd x HwGui

Mensagempor sygecom » 09 Jan 2018 08:58

Lembrei que uma vez o Rossine postou algo parecido, e Você deu uma melhorada, também pode ajudar:
viewtopic.php?f=45&t=15002&p=88212&hilit=teclado#p88212
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
leonardodemachado@hotmail.com
Avatar de usuário

sygecom
Membro Master

Membro Master
 
Mensagens: 6509
Data de registro: 21 Jul 2006 10:12
Cidade/Estado: Alvorada-RS
Curtiu: 1 vez
Mens.Curtidas: 49 vezes

Hb_IdleAdd x HwGui

Mensagempor Claudio Soto » 09 Jan 2018 09:17

En mi humilde opinión creo que si lo que quieres hacer es chequear algo a un intervalo de tiempo determinado un simple SET Timer como propuso Sigecom es suficiente, porque cada thread en Windows tiene su propio lazo de mensajes y por lo tanto el Timer es independiente sin ninguna ventaja sobre un thread único, en este caso la unica ventaja de multithread es que la tarea de chequeo demore mucho procesando e interfiera con el funcionamiento del programa principal.
Saludos.
Dr. Claudio Soto
(Uruguay)
http://srvet.blogspot.com
Avatar de usuário

Claudio Soto
Colaborador

Colaborador
 
Mensagens: 441
Data de registro: 27 Ago 2012 12:31
Cidade/Estado: Uruguay
Curtiu: 32 vezes
Mens.Curtidas: 131 vezes

Hb_IdleAdd x HwGui

Mensagempor JoséQuintas » 09 Jan 2018 09:34

Também não sei se um formulário "não modal" resolveria o problema.
Se é pra rotina ficar rodando, que rode em sua própria janela, visível ou não.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 9089
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 6 vezes
Mens.Curtidas: 526 vezes

Hb_IdleAdd x HwGui

Mensagempor asimoes » 09 Jan 2018 10:46

Quintas,

A janela que inicia o sistema é do tipo MAIN e as rotinas são do tipo dialog (modal)
►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 de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 3645
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 205 vezes
Mens.Curtidas: 154 vezes




Retornar para HwGui

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 1 visitante


Faça uma doação para o forum
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro