Página 1 de 1

errorsys: multithread e mix

Enviado: 05 Mar 2025 14:07
por JoséQuintas
Fazer mix é interessante.

Você tem uma rotina GTWVG.
Essa rotina GTWVG chama uma rotina FIVEWIN.
Mas dá erro...
Vém a rotina de erros da HWGUI !!!!

Parece doido, mas é interessante isso.

Vamos endoidar mais:

Código: Selecionar todos

#include "fivewin.ch"

PROCEDURE ze_fwTextMsg

   LOCAL oDlgMsg, nCont

   hb_ThreadStart( { || ;
      ErrorBlock( { | e | JoseQuintasError( e ) } ), ;
      oDlgMsg := DlgTextMsgClass():New(), ;
      oDlgMsg:bCodeBlock := { || MsgExclamation( "ok" ) }, ;
      oDlgMsg:Execute() } )

   ErrorBlock( { | e |  oDlgMsg:lCanClose := .T., oDlgMsg:End(), JoseQuintasError( e ) } )

   Inkey(2)
   FOR nCont = 1 TO 50
      oDlgMsg:ShowText( "Test " + Ltrim( Str( nCont ) ) )
      oDlgMsg:nGAtual += 2
      oDlgMsg:ShowMeter( oDlgMsg:nGAtual )
      Inkey(0.5)
   NEXT
   MsgExclamation( "End" )
   oDlgMsg:lCanClose := .T.
   oDlgMsg:End()

   RETURN
Não tem nada doido, é relativamente normal.

Em fase de testes, vamos colocando as necessidades.
Depois no uso normal, fazemos rotinas pra reduzir fonte.

O que acontece ?

É uma chamada multithread fora da rotina normal de chamadas. Preciso trocar a errorsys dessa thread.

E a dialog fivewin ?
Ela tem lá o VALID ::lCanClose, não vai deixar fechar, MESMO SE DER ERRO
Então acrescento na rotina de erros pra fazer isso, alterando o codeblock, e não mexendo no fonte errorsys.prg.

Como eu disse, parece doido, mas é relativamente normal.

Faltou dizer:

É MULTITHREAD.

O menu chama um módulo. deu erro. o módulo é fechado.
O menu e outros módulos continuam funcionando.
É diferente das rotinas de erro normais das LIBs gráficas, que fecham todo aplicativo.

Estranhei que só neste fonte é que entrou a errorsys da hwgui, talvez a chamada extra multithread.
Só forçar o uso da minha nos meus fontes.

Nota:
A errorsys é definida ao chamar Errorsys()
O harbour faz isso no início do aplicativo.
Não tenho certeza em multithread.
E muito menos quando se juntam LIBs que tem errorsys própria.
A única certeza é que se defino o codeblock pra erro no meu fonte, é ele que vai ser usado.