asimoes escreveu:Quintas
Descobre outra coisa.
Assim não dá janela não respondendo:
Veja a variável pública nLinha, exibindo nas 2 janelas nas funções Teste() e WaitThread( nThread )FUNCTION MAIN()
PUBLIC nLinha
nThread := hb_ThreadStart( HB_BITOR( HB_THREAD_INHERIT_PUBLIC, ;
HB_THREAD_INHERIT_PRIVATE, ;
HB_THREAD_INHERIT_MEMVARS ), ;
{ || Teste() } )
//hb_ThreadWaitForAll()
WaitThread( nThread )
RETURN Nil
FUNCTION Teste()
LOCAL oCrt
//oCrt := WvgCrt():new( , , { -1, -1 }, { 25, 80 }, , .T. )
oCrt := WvgCrt():New( , , { -1, -1 }, { 26, 80 }, , .F. )
oCrt:lModal := .T.
oCrt:visible := .T.
oCrt:resizable := .F.
oCrt:style := WIN_WS_POPUP + WIN_WS_CAPTION + WIN_WS_SYSMENU + DS_CENTER + WS_VISIBLE + WS_SYSMENU
oCrt:fontName := "Lucinda Console"
oCrt:fontHeight := 24
oCrt:fontWidth := 13
oCrt:create()
Hb_GTInfo( HB_GTI_WINTITLE, "Teste com Thread" )
HB_gtInfo( HB_GTI_MAXIMIZED, .T. )
FOR nLinha:=1 TO 3000000
@ 0,0 SAY StrZero( nLinha, 7 )
//Evento()
Inkey()
NEXT
oCrt:destroy()
RETURN Nil
FUNCTION WaitThread( nThread )
DO WHILE .T.
IF hb_ThreadWait( nThread, 0.1, .T. ) == 1
EXIT
ENDIF
@ 10,00 say nLinha
Evento()
ENDDO
RETURN Nil
Como cada thread tiene su propia cola de mensajes de Windows, el DoEvents solo vacÃa la cola del thread en el cual es llamado, para vaciar todas las colas hay que adjuntar todas las colas de mensajes a la del thread principal, de esa manera independiente de donde se invoque el DoEvents va a vaciar la cola de todos los thread:
El la función main se coloca:
Private nMainThreadID := GetCurrentThreadID()
Y luego de llamar:
Local pThID [ ... ]
pThID[ 1 ] := hb_threadStart( ....
pThID[ 2 ] := hb_threadStart( ....
pero antes de llamar cualquier ThreadWait se coloca:
AttachThreadInput( nMainThreadID, HMG_ThreadHBtoWinID( pThID[ 1 ] ), .T. )
AttachThreadInput( nMainThreadID, HMG_ThreadHBtoWinID( pThID[ 2 ] ), .T. )
De esta manera se adjunta todas las colas de mensajes de cada thread a la cola de mensajes del thread principal.
El código de las funciones GetCurrentThreadID, AttachThreadInput, HMG_ThreadHBtoWinID y de otras funciones últimos están en c:\hmg.3.4.4\source\c_Thread.c
Existen varios ejemplos en la carpeta: c:\hmg.3.4.4\samples\MultiThread