Pra quem quiser brincar, uma forma excelente (eu adorei) é a que vou postar agora.
Basicamente é rodar módulos em threads separadas, e poder fazer o que quiser com cada módulo.
Preparei pra qualquer GT, mas não funcionou em GTWIN, só em GTWVT e GTWVG. Não tenho como testar com GTQT.
O exemplo permite abrir janelas infinitas, e pode usar o mouse no prompt da janela principal.
Uma vez módulos independentes, pode fazer o que quiser com eles, até adicionar visual gráfico.
E na prática, poderia misturar GTs, cada módulo numa GT.
Nada de comandos complicados, classes, ou algo parecido.
Mas... o que há de diferente neste exemplo?
É tão independente, que pode até fechar o menu principal, sem dar erro!!!!!
Bom divertimento.
Pra compilar pode ser:
hbmk2 test -mt -gtwvt
hbmk2 test -mt -gtwvg
Código: Selecionar todos
#include "hbgtinfo.ch"
#include "inkey.ch"
STATIC aThreadList := {}
PROCEDURE Main
LOCAL nThreadId
IF .NOT. hb_gtInfo( HB_GTI_VERSION ) $ "WVG,WVT" .OR. .NOT. hb_mtvm()
CLS
? "Need GTWVG or GTWVT and Multithread"
QUIT
ENDIF
nThreadId := hb_ThreadStart( { || Sistema() } )
Aadd( aThreadList, nThreadId )
DO WHILE IsThreadRunning()
Inkey(2)
ENDDO
RETURN
PROCEDURE Sistema
LOCAL nCont, nOpc := 0
hb_gtReload( hb_GTInfo( HB_GTI_VERSION ) )
SET SCOREBOARD OFF
SET( _SET_EVENTMASK, INKEY_ALL - INKEY_MOVE + HB_INKEY_GTEVENT )
SetMode( 24, 80 )
CLS
DO WHILE .t.
@ 15, 10 SAY hb_gtInfo( HB_GTI_VERSION )
FOR nCont = 1 TO 10
@ nCont, 10 PROMPT "OPCAO X"
NEXT
MENU TO nOpc
IF LastKey() == K_ESC .OR. nOpc == 0
EXIT
ENDIF
ExecuteModule()
ENDDO
RETURN
FUNCTION ExecuteModule()
LOCAL nThreadId
nThreadId := hb_ThreadStart( { || MyModule() } )
Aadd( aThreadList, nThreadId )
RETURN NIL
FUNCTION MyModule()
LOCAL GetList := {}, cTexto
hb_gtReload( hb_gtInfo( HB_GTI_VERSION ) )
SetMode( 24, 80 )
hb_gtInfo( HB_GTI_WINTITLE, "Modulo de Teste" )
CLS
cTexto := Pad( "Testando", 80 )
@ 15, 10 SAY hb_gtInfo( HB_GTI_VERSION )
@ 16, 10 SAY "MultiWindow:" + iif( hb_gtInfo( HB_GTI_ISMULTIWIN ), "Yes", "No" )
@ 5, 5 SAY "Nome:" GET cTexto
READ
ThreadListRemove( hb_ThreadSelf() )
RETURN NIL
STATIC FUNCTION ThreadListRemove( nThreadId )
LOCAL nCont
FOR nCont = 1 TO Len( aThreadList )
IF aThreadList[ nCont ] == nThreadId
aDel( aThreadList, nCont )
aSize( aThreadList, Len( aThreadList ) - 1 )
EXIT
ENDIF
NEXT
RETURN NIL
FUNCTION IsThreadRunning()
LOCAL lIsRunning := .f.
IF Len( aThreadList ) != 0
lIsRunning := hb_ThreadWait( aThreadList, 0.1, .t. ) != Len( aThreadList )
ENDIF
RETURN lIsRunning
FUNCTION Main - novo módulo principal
PROCEDURE Sistema - o programa principal
FUNCTION ExecuteModule() - Rotina pra executar módulos em multithread e adicionar a thread à lista
FUNCTION MyModule() - O módulo/programa/janela
FUNCTION ThreadListRemove() - Remove a thread da lista
FUNCTION IsThreadRunning() - Verifica se alguma thread ainda está rodando
Variável aThreadList - Contém a lista de threads
hb_gtReload() - como a GT é padrão, e já é aberta por default (mesmo sem tela), as próximas janelas são criadas com gt_Reload, só isso.



