fechar dialog "morta" em outra thread

Discussão sobre a biblioteca Fivewin - O Clipper para Windows.

Moderador: Moderadores

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

fechar dialog "morta" em outra thread

Mensagem por JoséQuintas »

GTWVG, FIVEWIN, HWGUI e multithread.
Acho que sou o único com esse uso fora do normal, mas não custa perguntar.

Cada coisa roda em sua thread, tudo ok.

Num uso específico, uso GTWVG numa thread, atualizando a dialog FIVEWIN em outra thread.
Tudo bem, a não ser quando dá erro em GTWVG, erro não controlável, por exemplo erro de internet/MySQL, quando o provedor entra em manutenção.
Apesar dos testes, eventualmente escapa erro, mesmo que seja uma vez por mês, atrapalha, principalmente numa rede onde o gerenciador de tarefas está bloqueado para o usuário.
A dialog FIVEWIN fica zumbi, não tem mais aplicativo, só tem a dialog que não responde a comando nenhum.

Por enquanto, minha única idéia é usar uma rotina antiga.
Ela fica testando uma thread, e se fecha se a thread indicada fechou.
No caso, acrescentaria aí pra fechar a dialog fivewin.

Código: Selecionar todos

CREATE CLASS RunWhileThreadClass

   VAR lExit        INIT .F.
   VAR nThreadId
   VAR nInterval    INIT 600
   VAR cWindowTitle INIT ""
   VAR bCode
   METHOD New()     INLINE ::nThreadId := hb_ThreadSelf(), SELF
   METHOD Execute( bCode )

   ENDCLASS

METHOD Execute( bCode ) CLASS RunWhileThreadClass

   LOCAL nCont

   hb_gtReload( "WVG" )
   IF bCode != Nil
      ::bCode := bCode
   ENDIF
   AppInitSets()
   HB_GtInfo( HB_GTI_WINTITLE, ::cWindowTitle )
   //wvgSetAppWindow():Hide()
   DO WHILE ! ::lExit
      Eval( ::bCode )
      FOR nCont = 1 TO ::nInterval
         //hb_ReleaseCPU()
         IF hb_ThreadWait( ::nThreadId, 0.1, .T. ) == 1
            ::lExit := .T.
         ENDIF
         Inkey(1)
         IF ::lExit
            EXIT
         ENDIF
      NEXT
   ENDDO
   //hb_gcAll(.T.)

   RETURN Nil
Alguém tem alguma outra idéia, sem ser criar thread adicional?

NÃO É FECHAR APLICATIVO.
É fechar somente a parte envolvida nesse processo específico.
José M. C. Quintas
Harbour 3.2, mingw, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (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/
Kapiaba
Colaborador
Colaborador
Mensagens: 1916
Registrado em: 07 Dez 2012 16:14
Localização: São Paulo
Contato:

Re: fechar dialog "morta" em outra thread

Mensagem por Kapiaba »

Dia Quintas, este código que você postou, é para controlar a rotina em FIVEWIN, ou para a outra biblioteca W.. não sei o que?

Seria interessante você postar a ROTINA QUE CONGELA(em FIVEWIN), ela está redonda mesmo?

Regards, saludos.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20424
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

Re: fechar dialog "morta" em outra thread

Mensagem por JoséQuintas »

A rotina tem dependências.

Considere o seguinte:
Tem uma dialog fivewin, ela apenas é aberta.
Tem as rotinas GTWVG, elas enviam comandos pra essa dialog, e fazem todo processo de "navegação".
Ao dar erro, a dialog fivewin continua lá, mas como não faz nada sozinha, continua lá.

Acho que encontrei uma saída, mas falta oportunidade de teste.
O VALID da dialog é o que impedia de fechar.
Acrescentei um teste no valid, pra testar se a thread gtwvg ainda está rodando.
Pelo menos fechar no "X" deixa de ser bloqueado.
José M. C. Quintas
Harbour 3.2, mingw, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (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