Executar um método de uma classe com hb_threadStart

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

Executar um método de uma classe com hb_threadStart

Mensagem por asimoes »

Quintas,

Funcionou.

Eu tenho uma classe que tem o mesmo método ImprimeRaw, eu modifiquei o nome e não deu o erro.

E essa classe é iniciada no inicio do programa com uma variável pública.

Pelo o que eu estou vendo também hb_ThreadStar não deixar passa parâmetro,

cVar:="sistema.log"
nThread:=hb_ThreadStart( { || oImprime:ImprimeRaw(cVar) } ) //dá erro informa que variável cvar não existe
►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

Executar um método de uma classe com hb_threadStart

Mensagem por JoséQuintas »

E essa classe é iniciada no inicio do programa com uma variável pública.
Se quando vai usar coloca New(), não precisaria ser pública, está sempre criando uma nova instância da classe.
E piorou, está usando multithread em algo que não é preparado pra multithread.
Supondo que possa fazer dois relatórios de uma vez, como mexer na variável em uso?
Talvez seja interessante repensar esse uso.

Pode fazer algo mais interessante, sem nem precisar ficar multiplicando o uso da classe ou a variável, talvez algo parecido com isto:

Código: Selecionar todos

PrintReport( cNomeDoc )

FUNCTION PrintReport( cNomeDoc )

   LOCAL oRelatorio

   oRelatorio := ClasseImpressao:New()
   oRelatorio:cNomeDoc := cNomeDoc
   hbThreadStart( { || oRelatorio:ImprimeRaw() } )
   RETURN NIL
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

Executar um método de uma classe com hb_threadStart

Mensagem por asimoes »

Quintas,

Se não iniciar a variável como local -> LOCAL oRelatorio, dá erro.

E também não aceita PUBLIC oRelatorio, ou PRIVATE oRelatorio, dá erro.
►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)
rossine
Usuário Nível 3
Usuário Nível 3
Mensagens: 325
Registrado em: 06 Ago 2007 09:57
Localização: Divinópolis-MG

Executar um método de uma classe com hb_threadStart

Mensagem por rossine »

Olá pessoal,

Desculpem, posso não ter entendido correto o que precisam, mas acho que é possível transferir variáveis de uma thread para outra, foi o que vi no exemplo:

c:\harbour-core\tests\mt\mttest08.prg

Código: Selecionar todos

/*
 * Demonstration/test code for using memvar variables sharing and
 * copping
 *
 * Copyright 2008 Przemyslaw Czerpak <druzus / at / priv.onet.pl>
 *
 */

#include "hbthread.ch"

memvar pub1, pub2
memvar prv1, prv2

procedure Main()

   ? Version()
   ? "Main start"

   public pub1, pub2
   private prv1, prv2

   ?
   ? "Do not inherit memvars."
   initVars()
   ? "main thread:"
   testAllVars()
   hb_threadJoin( hb_threadStart( @thFunc() ) )
   ? "main thread:"
   testAllVars()
   wait

   ?
   ? "Inherit copy of publics."
   initVars()
   ? "main thread:"
   testAllVars()
   hb_threadJoin( hb_threadStart( hb_bitOr( HB_THREAD_INHERIT_PUBLIC, ;
                                            HB_THREAD_MEMVARS_COPY ), ;
                                  @thFunc() ) )
   ? "main thread:"
   testAllVars()
   wait

   ?
   ? "Inherit copy of privates."
   initVars()
   ? "main thread:"
   testAllVars()
   hb_threadJoin( hb_threadStart( hb_bitOr( HB_THREAD_INHERIT_PRIVATE, ;
                                            HB_THREAD_MEMVARS_COPY ), ;
                                  @thFunc() ) )
   ? "main thread:"
   testAllVars()
   wait

   ?
   ? "Inherit copy of publics and privates."
   initVars()
   ? "main thread:"
   testAllVars()
   hb_threadJoin( hb_threadStart( hb_bitOr( HB_THREAD_INHERIT_MEMVARS, ;
                                            HB_THREAD_MEMVARS_COPY ), ;
                                  @thFunc() ) )
   ? "main thread:"
   testAllVars()
   wait

   ?
   ? "Share publics with child threads."
   initVars()
   ? "main thread:"
   testAllVars()
   hb_threadJoin( hb_threadStart( HB_THREAD_INHERIT_PUBLIC, @thFunc() ) )
   ? "main thread:"
   testAllVars()
   wait

   ?
   ? "Share privates with child threads."
   initVars()
   ? "main thread:"
   testAllVars()
   hb_threadJoin( hb_threadStart( HB_THREAD_INHERIT_PRIVATE, @thFunc() ) )
   ? "main thread:"
   testAllVars()
   wait

   ?
   ? "Share publics and privates with child threads."
   initVars()
   ? "main thread:"
   testAllVars()
   hb_threadJoin( hb_threadStart( HB_THREAD_INHERIT_MEMVARS, @thFunc() ) )
   ? "main thread:"
   testAllVars()
   wait

   return

static procedure initVars()

   pub1 := "main:public1"
   pub2 := "main:public2"
   prv1 := "main:private1"
   prv2 := "main:private2"

   return

static procedure testAllVars()

   test_var( "PUB1" )
   test_var( "PUB2" )
   test_var( "PRV1" )
   test_var( "PRV2" )

   return

static procedure test_var( cVarName )

   ? "    " + cVarName + ":", Type( cVarName )
   if ! Type( cVarName ) == "U"
      ?? " ->", &cVarName
   endif

   return

static procedure thFunc()

   ? "child thread:"
   testAllVars()
   ? "assign..."
   pub1 := "thread:public1"
   pub2 := "thread:public2"
   prv1 := "thread:private1"
   prv2 := "thread:private2"
   ? "child thread:"
   testAllVars()

   return

Rossine.

Harbour 3.4, MingW / Msvc, QT, Qt5xhb, GtQtc, DbfCdx, MySql/MariaDB.
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Executar um método de uma classe com hb_threadStart

Mensagem por asimoes »

Rossine,

Eu conheço esse exemplo, a questão é passar um método de uma classe para hb_threadStart, já consegui executar, só que a variável tem que ser iniciada como local
►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