Multithread - aguardar processo / transferir dados

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Multithread - aguardar processo / transferir dados

Mensagem por JoséQuintas »

Usei algo diferente agora, pra usar FIVEWIN.

A velha história: multithread é igual EXE separado, as janelas são independentes...
Tem aquilo de dialog modal e não modal, que só complica, porque é multithread.
Então fui pelo mais simples, eu acho...

Código: Selecionar todos

      pThread := RunModule( { || cKeyboard := FWBrowseADO( @cnSQL, @oTBrowse, cFilterKey, bKeyboard, bUserFunction, ;
         nFixToCol, aAdoFilterList, aBtnList ) }, "browse", "FIVEWIN" )
      DO WHILE hb_ThreadWait( pThread, 0.1, .T. ) != 1
         Inkey(0.3)
      ENDDO
      IF ! Empty( cKeyboard )
         KEYBOARD cKeyboard + Chr(13)
      ENDIF
      RETURN Nil
Executo em multithread, e fico aguardando a thread terminar.
Durante o teste se a thread terminou, o Inkey() a fim de não travar a janela atual GTWVG.
A execução vai retornar o que precisa pra KEYBOARD
O DO WHILE é necessário, senão o programa vai em frente sem esperar o retorno.

Nada diferente do que a maioria já conhece.
Em GUI costumam usar DoEvents() ou algo parecido, no harbour/GTWVG basta o próprio Inkey() pra isso.
Em GUI costumam usar dialog MODAL, pra travar a dialog anterior.
Neste caso uso o DO WHILE, e é muito mais do que dialog, é multithread.
E são dialogs de LIBs diferentes, GTWVG e FIVEWIN, não adianta querer que o MODAL de uma lib tenha efeito encima de outra LIB.

Nunca usei dessa forma, mas é a primeira situação com essa necessidade.
O KEYBOARD no fivewin não funciona, mas na GTWVG funciona.
Cada LIB faz sua parte e pronto.

Precisei alternativa pra isso, e resolvi assim.
É misturar LIBs, mas sem misturar fontes, fazendo cada LIB cuidar de sua parte.
E no caso de multithread, cuidar pra transferência de informação acontecer como deve.

Tem coisas que é mais fácil resolver com multithread, do que de outra forma.
Já pensaram se fosse integrar GTWVG e FIVEWIN, mexer nas classes internas de cada LIB pra funcionarem juntas ?
Pois é... com multithread foi relativamente fácil, não precisou alterar fonte de LIB nenhuma.

Lembrando:
Multithread pode ser usada em: GTWVG, GTWVT, HWGUI, FIVEWIN, e também em Linux.
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/
Responder