Como usar multiplos threads?

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

Moderador: Moderadores

sambomb
Usuário Nível 3
Usuário Nível 3
Mensagens: 250
Registrado em: 24 Out 2008 17:02
Localização: Itaocara - RJ - Brasil

Como usar multiplos threads?

Mensagem por sambomb »

Olá, estou tentando desenvolver uma tela de carregamento para algumas funções demoradas como leitura da memória fiscal de um ECF

Preciso que um timer rode simultaneamente a um Eval() atualizando um meter a cada 1 segundo....


Alguem sabe dar um exemplo de como fazer rodar simultaneamente com threads?

Exemplo:

Código: Selecionar todos

Function MsgEspera(bAction)
   local oDlg, oMeter, oText, oBtn, oFont
   local nVal := 90, Result := .T., oTmr := NIL, nCont

   DEFAULT bAction  := { || SysWait(10) }

   DEFINE DIALOG    oDlg            ;
			 FROM      5, 5 TO 10, 45  ;
			 TITLE 	  "Titulo"
			 
   DEFINE Timer     oTmr            ;
          Of        oWnd	         ;
			 Interval  100             ;          
          Action    (nCont++ )
			 
   oDlg:lHelpIcon := .F.
                                    
   @ 1,   0.7 PROGRESS oMeter       ;
	       POSITION  nVal            ;
			 SIZE      150,10          ;
			 OF        oDlg           

   oDlg:bStart = { || oTmr:Activate(), SysWait(0.2), Result := Eval( bAction) , SysWait(0.2), oDlg:End() }

   ACTIVATE DIALOG   oDlg;
				CENTERED
				          
   oTmr:Deactivate()
   oTmr:End()
   oTmr:= NIL
   Alert(nCont)
return Result
Imagem

Rca Sistemas - Itaocara - RJ
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Re: Como usar multiplos threads?

Mensagem por sygecom »

Olá sambomb,
Para usar MT(Multi-thread) você tem que primeiro ver se as lib's que você usa são compativeis com MT, no caso da Hwgui tem: hwgui.lib e hwguimt.lib, que evidente uma é para modo ST e outra MT. Depois de verificar isso, é facil de montar as Rotinas MT, porem exige alguns pequenos cuidados com variáveis publicas e private.
Veja o exemplo abaixo, que é simples e explica o que você deseja:

Código: Selecionar todos

/*
 * $Id: mttest01.prg 10153 2009-02-03 02:05:45Z druzus $
 */

/*
 * Harbour Project source code:
 *    demonstration/test code for thread return complex values
 *    and detached locals created by thread and used after thread
 *    termination.
 *
 * Copyright 2008 Przemyslaw Czerpak <druzus / at / priv.onet.pl>
 * www - http://www.harbour-project.org
 *
 */

#ifdef __XHARBOUR__
   #xtranslate hb_threadStart( <x,...> ) => StartThread( <x> )
   #xtranslate hb_threadJoin( <x,...> ) => JoinThread( <x> )
#endif

static s_var
proc main()
   local xResult
   ? Version()
   ? "join:", hb_threadJoin( hb_threadStart( @thFunc() ), @xResult )
   ? "result:", xResult
   ? "static var type:", valtype( s_var )
   ? eval( s_var )
   ? eval( s_var )
return

func thFunc()
   local i := 12345.678
   s_var := { || i++ }
return repl( "Hello World!!! ", 3 )
Nota: No Harbour os MT está muito mais estáveis, até mesmo por uma questão de lógica, pelo que sei quem implantou MT no xHarbour foi Przemyslaw Czerpak, e quando ele foi implantar no Harbour anos depois ele já sabia onde não devia errar e como devia implantar com mais eficiência, por que o mesmo já tinha uma bagagem no xHarbour e fez ele implantar com mais eficiência no Harbour.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
sambomb
Usuário Nível 3
Usuário Nível 3
Mensagens: 250
Registrado em: 24 Out 2008 17:02
Localização: Itaocara - RJ - Brasil

Re: Como usar multiplos threads?

Mensagem por sambomb »

No meu caso eu utilizo xharbour e fivewin....
xHarbour 1.1.0 e Fivewin 8.02, compilo através do xDev e nele tem uma opção para identificar se é MT ou não... mas ja tentei marcar a tal flag e não resolveu( usei a função HB_MultiThread() ) para verificar se funcionou ou não...

Sabe como devo proceder nesse caso?
Imagem

Rca Sistemas - Itaocara - RJ
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Re: Como usar multiplos threads?

Mensagem por sygecom »

Olá sambomb,
sambomb escreveu:No meu caso eu utilizo xharbour e fivewin....
Você já viu se a Fivewin é compativel com MT ?
xHarbour 1.1.0 e Fivewin 8.02, compilo através do xDev e nele tem uma opção para identificar se é MT ou não... mas ja tentei marcar a tal flag e não resolveu( usei a função HB_MultiThread() ) para verificar se funcionou ou não...
Com xDev não faço idéia, mas já posso lhe adiantar que com xharbour suas dores de cabeça serão inumeras, se queres usar MT com mais segurança lhe recomendo fortemente para pensar em migrar para Harbour.
Sabe como devo proceder nesse caso?
Antes de qualquer coisa, você te que ver se as LIB que você usa são compatíveis com MT.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Responder