Página 2 de 2
Executar um método de uma classe com hb_threadStart
Enviado: 20 Jun 2016 10:36
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
Executar um método de uma classe com hb_threadStart
Enviado: 20 Jun 2016 10:59
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
Executar um método de uma classe com hb_threadStart
Enviado: 20 Jun 2016 12:25
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.
Executar um método de uma classe com hb_threadStart
Enviado: 20 Jun 2016 20:30
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
Executar um método de uma classe com hb_threadStart
Enviado: 20 Jun 2016 21:14
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