Página 1 de 2

Função 'Quit' ao executar faz o .exe para de funcionar.

Enviado: 03 Dez 2021 16:23
por João Eduardo
Olá pessoal, boa tarde, minha primeira vez solicitando auxílio neste fórum, mas gostaria de um auxílio referente a um "erro" que acontece ao tentar finalizar uma aplicação, oque ocorre é que no momento que o código passa pelo 'Quit' ou outra função que seja responsável por finalizar, o executável para de responder e é necessário clicar em fechar na tela de "executável não respondendo" do Windows, mas o grande porém é que este erro ocorre apenas na versão do windows server (no caso a de 2012), nos demais windows, é finalizado sem o menor problema, caso alguém tenha uma ideia de como atuar em cima disso, ficaria mt grato. (o código em xHarbour das funções que finalizam seguem abaixo.)

Código: Selecionar todos

**********************
Procedure FchGrs(vTpoCar_)
Sr_End()                     
Finalizar(.F.)
Quit
Return Nil
**********************
Procedure Finalizar(lStaFin_)
lSaiDlg:=.T.
DbCloseAll()
FecBloAce()
If oVentPrinc<>Nil
   SysRefresh()
   oVentPrinc:End()
   If oFrPrn<>NIl
      oFrPrn:DestroyFR()
   EndIf
   FreeResources()
   GlobalFree()
   Release All
   ResAllFree()
EndIf
Return(.T.)
**********************

Função 'Quit' ao executar faz o .exe para de funcionar.

Enviado: 03 Dez 2021 16:58
por alxsts
Olá!

Seja bem-vindo ao Fórum, João!

Provavelmente o problema ocorre durante a execução da função Finalizar(), que executa várias outras funções...

Sugiro que comente todas estas outras funções, compile e execute. Creio que vá funcionar. Depois vá removendo o comentário, um a um, das funções anteriormente comentadas. Compile e execute. Se passar, repita o processo. Senão, verifique a função onde ocorreu o erro.

Função 'Quit' ao executar faz o .exe para de funcionar.

Enviado: 03 Dez 2021 17:03
por Itamar M. Lins Jr.
Olá
Bem vindo ao forum.
Está usando uma lib gráfica. Qual ?

Hwgui é diferente.

Mas sem ver que funções são essas que vc chama não posso responder com maior precisão.
Sr_End() ? FecBloAce() ... etc

Saudações,
Itamar M. Lins Jr.

Função 'Quit' ao executar faz o .exe para de funcionar.

Enviado: 04 Dez 2021 15:34
por rochinha
Amiguinhos,

{João Eduardo[/b], faça um trace:

Código: Selecionar todos

Procedure FchGrs(vTpoCar_)
? "passei 1"
Sr_End()                     
? "passei 2"
Finalizar(.F.)
? "passei 3"
Quit
? "passei 4"
Return Nil
Se não chegar ao 4 é porque travou no Quit.

Função 'Quit' ao executar faz o .exe para de funcionar.

Enviado: 04 Dez 2021 18:38
por JoséQuintas
Quando diz windows server, isso significa via terminal service ou direto nele?

Como tenho (nem sei direito se ainda tenho) cliente usando terminal service, notei diferenças na GTWVG, e no ADO.

Por exemplo:

Numa máquina comum, o retorno de consulta sem conteúdo é Nil, uma variável contendo NADA.
Já em terminal service, o retorno é um recordset sem conteúdo, o que é diferente de Nil, é uma variável contendo um recordset vazio.

O programa que o Windows diz travado, não é exatamente travado, é porque o Windows não está recebendo resposta do programa.
Isso pode acontecer se o programa estiver trabalhando, e não existir tratamento de eventos para essa situação.

Num teste básico com GTWVG, que tem janela Windows:

Código: Selecionar todos

DO WHILE .T.
ENDDO
isso acima, vai causar essa mensagem no Windows.

Código: Selecionar todos

DO WHILE .T.
   Inkey()
ENDDO
Isso acima não vai causar a mensagem, porque durante o processamento de Inkey() vai existir a tal "conversa com o Windows".

Em LIBs GUI, que não tem o Inkey(), geralmente tem o DoEvents() ou algo parecido, pra que isso não aconteça.

Então... pode ser alguma rotina sua, ou interna, que não está preparada pra alguma das situações acima.
Vai ter que acompanhar o passo a passo do encerramento, pra tentar identificar aonde está seu problema.
Pode colocar pontos de aviso, como já foi mostrado, pra ir reduzindo o bloco/rotina a ser pesquisado.

Função 'Quit' ao executar faz o .exe para de funcionar.

Enviado: 05 Dez 2021 10:40
por Kapiaba
FIVEWIN é fácil, mas precisa pegar as malandragens das boas, veja abaixo a melhor forma de fechar o seu programa com a máxima segurança:

P.S.: Se não entender, pode perguntar a vontade, talkey()? Me espanta o Rochinhas, mestre em FiveWin, falar as bobagesn que falou, votyyyyy. kkkkkkk

Código: Selecionar todos

PROCEDURE FchGrs( vTpoCar_ )

   Sr_End()

   Finalizar( .F. )

   // QUIT  aqui nao VEJA ABAIXO.

RETURN NIL
// *********************
PROCEDURE Finalizar( lStaFin_ )

   lSaiDlg := .T.

   dbCloseAll()

   FecBloAce() // ??? o que significa? tem looping?

   IF oVentPrinc <> Nil

      SysRefresh()

      // FECHE A WINDOW direto no Botao de Saida: oWnd:End()
      oVentPrinc:End()

      // FECHE O FAST REPORT direto no modulo de impressao.
      IF oFrPrn <> NIl
         // oFrPrn:DestroyFR()  // aqui nao.
      ENDIF

      FreeResources()

      // GlobalFree() // ISTO E PARA FIVE 16 BITS Nao precisa +

      RELEASE ALL

      // ResAllFree() // ISTO E PARA FIVE 16 BITS Nao precisa +

   ENDIF

Return( .T. )

// Veja como e facil:

   DEFINE BUTTON oSaida RESOURCE "FECHAR", "FECHAR2" OF oBar                 ;
      NOBORDER GROUP PROMPT "Saida"                                          ;
      MESSAGE "Sair do Programa"                                             ;
      ACTION( oSaida:Toggle(), ENCERRA( oWnd ), oSaida:GoUp() )              ;
      TOOLTIP { "Encerrar WinOrcam - Finalizar",                             ;
                "Encerrar o Programa Agora?   ", 1, CLR_WHITE, CLR_HBLUE }
      // BOTTOM - BTNRIGHT FLAT -> ASSIM, NAO FUNCIONA.


//-> Encerra o Programa
FUNCTION ENCERRA( oWnd  )

   LOCAL nKey := VK_RETURN, oMsgInter, oQuestao, cBackupDiario, oImgSaid
   LOCAL oDlg, oFontBak, oFontSay, IDCor, oSaida, oCancela, oGroup, aGrad
   LOCAL lPermissao := .F.  //-> PermissÆo Para Sair do Programa

   cBackupDiario := OemToAnsi( "SEGURAN€A: FA€A BACKUP DIµRIO." )

   // aGrad := { { 0.30, CLR_BLACK, CLR_YELLOW},{ 0.50, CLR_YELLOW, CLR_BLACK } }
   // aGrad := { { 0.30, CLR_CYAN, CLR_HCYAN },{ 0.70, CLR_HCYAN, CLR_CYAN } }
   aGrad := { { 0.30, CLR_WHITE, CLR_WHITE },{ 0.50, CLR_WHITE, CLR_WHITE } }

   DEFINE FONT oFontBak NAME "Ms Sans Serif" SIZE 0, -12 BOLD
   DEFINE FONT oFontSay NAME "Ms Sans Serif" SIZE 0, -14 BOLD
   // ESTA EM: AMBIENTY.RES
   DEFINE DIALOG oDlg RESOURCE "DLG_TERMINAR" GRADIENT aGrad

   oDlg:lHelpIcon := .F.

   REDEFINE SAY ID 401 OF oDlg COLORS CLR_CYAN, CLR_WHITE UPDATE FONT oFontSay TRANSPARENT
   REDEFINE SAY ID 402 OF oDlg COLORS CLR_CYAN, CLR_WHITE UPDATE FONT oFontSay TRANSPARENT
   REDEFINE SAY ID 403 OF oDlg COLORS CLR_HRED, CLR_WHITE UPDATE FONT oFontSay TRANSPARENT
   REDEFINE SAY ID 420 OF oDlg COLORS CLR_CYAN, CLR_WHITE UPDATE FONT oFontbak TRANSPARENT

   REDEFINE DYNAMIC SAY PROMPT cBackupDiario ID 801 OF oDlg CENTER BLINKING  ;
      COLOR CLR_MAGENTA, CLR_WHITE FONT oFontSay TRANSPARENT

   REDEFINE GROUP oGroup ID 501 OF oDlg FONT oFontSay COLOR CLR_CYAN

   // EM: IMAGENS2.RES - Joao
   REDEFINE BITMAP oQuestao ID 121 RESOURCE "SAIDAEXIT" OF oDlg TRANSPARENT ADJUST

   oQuestao:cToolTip := OemToAnsi( "Fechar o Programa e os Bancos de Dados." )

   REDEFINE BITMAP oImgSaid ID 122 RESOURCE "EXIT_SAIDA" OF oDlg TRANSPARENT ADJUST

   oImgSaid:cToolTip := OemToAnsi( "Sair Definitivamente dos Or‡amentos." )

   REDEFINE BUTTONBMP oSaida ID 301 OF oDlg RESOURCE "154" TEXTRIGHT         ;
      ACTION( lPermissao := .T., oDlg:End() ) NOBORDER

   oSaida:cTooltip := { "Click no Botão Para Sair",                          ;
                        "Sair do Programa Agora? ", 1, CLR_WHITE, CLR_HBLUE }

   REDEFINE BUTTONBMP oCancela ID 302 OF oDlg RESOURCE "103" TEXTRIGHT       ;
      ACTION( lPermissao := .F., oDlg:End() ) NOBORDER CANCEL

   oCancela:cTooltip :={ "Click no Botão Para Cancelar a Saida",             ;
                         "Cancelar a Saida do Programa?       ", 1, CLR_WHITE, CLR_HBLUE }

   SET FONT OF oSaida   TO oFontSay
   SET FONT OF oCancela TO oFontSay

   ACTIVATE DIALOG oDlg CENTERED

   DeleteObject( oFontSay )
   DeleteObject( oFontBak )

   //-> Permissao Para Sair do Menu Principal
   IF lPermissao  //-> Se for o Botao de Saida... Pimba!

      SETKEY( VK_F9,  { | nKey | NIL   } )
      SETKEY( VK_F11, { | nKey | NIL } )

      // LIBERA_TUDO()  // FECHA O PROGRAMA NA MEMORIA DEFINITIVAMENTE
      MsgRun( "FECHANDO O PROGRAMA E BANCOS DE DADOS.", ;
              "Por Favor, Espere! Vou Desligar.      ", ;
              { || WinExec( LIBERA_TUDO() ), 3 } )

   ELSE

      RETURN( .F. )

   ENDIF

RETURN NIL
//--Fecha o Programa Definitivamente
FUNCTION LIBERA_TUDO()

   //? "Desligando o NumLock"  // ESTA EM NUM_CAPS.PRG/E AQUI MESMO.
   SETNUMLOCK( .F. )

   // MsgStop( AltTabEnable( 0, .T. ), "Habilitando   ALT+TAB e ALT+ESC - Windows NT, 2k" )
   AltTabEnable( 0, .T. ) // LIGA O ALT+TAB

   IF FILE( "WINORCAM.LOG" )
      DELETEFILE( "WINORCAM.LOG" )
   ENDIF

   IF FILE( "ENCERRA.wav" )

      SndPlaySound( "ENCERRA.wav", 0 )

   ENDIF

   // se tiver
   RELEASE BRUSH oBrush
   RELEASE FONT oFont

   DbCommitAll()
   DbUnLockAll()
   DbCloseAll()
   FreeResources()
   Release All
   SysRefresh()
   HB_GCALL( .T. )

   CLEAR MEMORY

   PostQuitMessage( 0 )

   QUIT // nem e necessario.

RETURN NIL
Regards, saludos.

Função 'Quit' ao executar faz o .exe para de funcionar.

Enviado: 05 Dez 2021 10:47
por Kapiaba
Uma imagem fala por si, veja:
SAIRDOPROGRAMA.png
Dúvidas, pergunte, porfa.

Abs.

Regards, saludos.

Função 'Quit' ao executar faz o .exe para de funcionar.

Enviado: 05 Dez 2021 10:53
por Kapiaba
Diálogo, caso queira testar como eu estou fazendo: Somente troque as BITMAPS pelas suas.

Código: Selecionar todos

DLG_TERMINAR DIALOG 214, 92, 350, 120
STYLE DS_ABSALIGN | DS_MODALFRAME | 0x4L | WS_POPUP | WS_VISIBLE | WS_CAPTION
CAPTION "PLENOIND: Confirme Saida do Programa.                                     www.pleno.com.br"
FONT 8, "MS Sans Serif"
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
{
 PUSHBUTTON "&Saida", 301, 103, 79, 70, 18
 PUSHBUTTON "&Cancelar", 302, 176, 79, 70, 18
 CONTROL "TBitMap", 121, "TBitMap", WS_CHILD | WS_VISIBLE, 5, 11, 50, 63
 GROUPBOX "Finalizar o Programa", 501, 58, 6, 200, 70, BS_GROUPBOX | WS_GROUP
 CTEXT "Deseja Finalizar o Programa?", 401, 63, 23, 186, 14, SS_CENTER | NOT WS_GROUP
 CTEXT "Escolha uma Opção Abaixo", 402, 63, 39, 186, 14, SS_CENTER | NOT WS_GROUP
 CTEXT "Recomendamos um Backup.", 403, 63, 55, 186, 14, SS_CENTER | NOT WS_GROUP
 CONTROL "", 801, "TDSay", 0 | WS_CHILD | WS_VISIBLE, 0, 100, 349, 14
 CONTROL "TBitMap", 122, "TBitMap", WS_CHILD | WS_VISIBLE, 260, 11, 88, 63
 LTEXT "<ESC> Cancela", 420, 0, 86, 80, 12
}
Regards, saludos.

Função 'Quit' ao executar faz o .exe para de funcionar.

Enviado: 05 Dez 2021 13:29
por rochinha
Amiguinhos,

kapiaba acho que só basta trocar Quit por PostQuitMessage(0) se esta função for nativa do Harbour.

Função 'Quit' ao executar faz o .exe para de funcionar.

Enviado: 05 Dez 2021 15:18
por Kapiaba
My dear Rochinhas, PostQuitMessage(0) é do FIVEWIN, e funciona com HARBOUR ó xHARBOUR. Pure Show(). Fuerte abrazo.

Regards, saludos.

Função 'Quit' ao executar faz o .exe para de funcionar.

Enviado: 05 Dez 2021 18:53
por JoséQuintas
Kapiaba escreveu:My dear Rochinhas, PostQuitMessage(0) é do FIVEWIN, e funciona com HARBOUR ó xHARBOUR. Pure Show(). Fuerte abrazo.
Respostas confusas...
A saída para o problema que foi apresentada é colocar a dialog perguntando sim ou não?

fivewin:

Código: Selecionar todos

#ifdef __HARBOUR__
   CLIPPER POSTQUITMESSAGE( PARAMS ) // ( nExitCode )
#else
   CLIPPER POSTQUITME( PARAMS ) // SSAGE( nExitCode )
#endif
{
   PostQuitMessage( _parni( 1 ) );
}
hwgui:

Código: Selecionar todos

HB_FUNC( HWG_POSTQUITMESSAGE )
{
   PostQuitMessage( hb_parni( 1 ) );
}
Ao que me parece, é uma função do Windows.

Aproveitando:
Sobre essas coisas que comentei da LIB HBWIN, que são funções pra Windows.
Tanto no Harbour quanto no XHarbour, poderia ser acrescentada a função wapi_PostQuitMessage(), e padronizar geral.

Nota:
Apenas comentando da função PostQuitMessage(), não sei dizer se é a solução pra situação.
Se não me engano, essa função finaliza toda parte GUI, que pode ficar travada numa saída fora do normal.

Função 'Quit' ao executar faz o .exe para de funcionar.

Enviado: 05 Dez 2021 20:53
por rochinha
Amiguinhos,

Quem colocou a questão ainda não se manifestou, pois se ele fizer da maneira que apresentei ele verá em qual momento esta travando.

Se não passar do "2" é porque o problema esta onde o alxsts falou.
Se não passar do "3" então tem problema com o comando quit

Então ele pode implementar a função de saida forçada apropriada para sua versão de Harbour.

Função 'Quit' ao executar faz o .exe para de funcionar.

Enviado: 06 Dez 2021 09:23
por Kapiaba
Mister Quintas, se usasse FiveWin, saberia do que estou falando:

https://wiki.fivetechsoft.com/doku.php? ... uitmessage

Comando que invoca a API do windows, simplesmente excelente. Não precisa de DIÁLOGO para invocá-la, eu uso DIÁLOGO, primeiro porquê é bonito, segundo, dou a chance do usuário retornar caso se arrependa de sair do programa, só isso.

Aqui, um outro problema com o comando QUIT ou mistura de comandos de versões diferentes do FiveWin com o comando QUIT.

http://fivewin.com.br/index.php?/topic/ ... ent-290958

Solução foi simples.

Regrads, saludos.

Função 'Quit' ao executar faz o .exe para de funcionar.

Enviado: 06 Dez 2021 11:21
por JoséQuintas
Kapiaba escreveu:Não precisa de DIÁLOGO para invocá-la, eu uso DIÁLOGO, primeiro porquê é bonito, segundo, dou a chance do usuário retornar caso se arrependa de sair do programa, só isso.
Ok, não era solução, era apenas pra "uma saída mais bonita".
Aliás... provavelmente deve ter identificado se tratar de fivewin.
Kapiaba escreveu:Mister Quintas, se usasse FiveWin, saberia do que estou falando:
Ok também.
Por um instante pensei se tratar de outra coisa, mas está relacionado ao visual.

Já pensei várias vezes em testar fivewin, mas não poder usar o Harbour 3.4 não dá.

No ano passado, que estava no pique, cheguei a postar no fórum do fivewin se poderia colocar a versão free com exemplos no github, mas não obtive resposta.
Nem sei se essa versão ainda serve pra alguma coisa, acho que de 2005.

Hoje em dia, depois de anos de apito nos ouvidos sem parar, sem muito pique pra nenhuma, nem manual, nem #includes, nem porr. nenhuma.

Função 'Quit' ao executar faz o .exe para de funcionar.

Enviado: 06 Dez 2021 13:30
por JoséQuintas
Só complementando do PostQuitMessage():

https://docs.microsoft.com/en-us/window ... uitmessage
The PostQuitMessage function posts a WM_QUIT message to the thread's message queue and returns immediately; the function simply indicates to the system that the thread is requesting to quit at some time in the future.

When the thread retrieves the WM_QUIT message from its message queue, it should exit its message loop and return control to the system. The exit value returned to the system must be the wParam parameter of the WM_QUIT message.
Aqui tem um exemplo:
https://docs.microsoft.com/en-us/window ... age-queues

Código: Selecionar todos

case WM_DESTROY: 
 
    // Perform cleanup tasks. 
 
    PostQuitMessage(0); 
    break; 
É interessante.
Ainda mais quando fala sobre thread.

Simplificando: é um encerramento forçado, não sei se esse forçado significa deixar de fazer outras coisas importantes, mas acredito que não.