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: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 )
Código: Selecionar todos
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
El la función main se coloca:
Código: Selecionar todos
Private nMainThreadID := GetCurrentThreadID()Código: Selecionar todos
Local pThID [ ... ]
pThID[ 1 ] := hb_threadStart( ....
pThID[ 2 ] := hb_threadStart( ....
Código: Selecionar todos
AttachThreadInput( nMainThreadID, HMG_ThreadHBtoWinID( pThID[ 1 ] ), .T. )
AttachThreadInput( nMainThreadID, HMG_ThreadHBtoWinID( pThID[ 2 ] ), .T. )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



