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

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

João Eduardo
Usuário Nível 1
Usuário Nível 1
Mensagens: 9
Registrado em: 28 Jul 2021 18:25
Localização: Paracatu/MG

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

Mensagem 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.)
**********************
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

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

Mensagem 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.
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

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

Mensagem 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.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

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

Mensagem 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.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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

Mensagem 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.
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/
Kapiaba
Colaborador
Colaborador
Mensagens: 1908
Registrado em: 07 Dez 2012 16:14
Localização: São Paulo
Contato:

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

Mensagem 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.
Kapiaba
Colaborador
Colaborador
Mensagens: 1908
Registrado em: 07 Dez 2012 16:14
Localização: São Paulo
Contato:

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

Mensagem por Kapiaba »

Uma imagem fala por si, veja:
SAIRDOPROGRAMA.png
Dúvidas, pergunte, porfa.

Abs.

Regards, saludos.
Kapiaba
Colaborador
Colaborador
Mensagens: 1908
Registrado em: 07 Dez 2012 16:14
Localização: São Paulo
Contato:

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

Mensagem 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.
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

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

Mensagem por rochinha »

Amiguinhos,

kapiaba acho que só basta trocar Quit por PostQuitMessage(0) se esta função for nativa do Harbour.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Kapiaba
Colaborador
Colaborador
Mensagens: 1908
Registrado em: 07 Dez 2012 16:14
Localização: São Paulo
Contato:

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

Mensagem por Kapiaba »

My dear Rochinhas, PostQuitMessage(0) é do FIVEWIN, e funciona com HARBOUR ó xHARBOUR. Pure Show(). Fuerte abrazo.

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

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

Mensagem 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.
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/
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

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

Mensagem 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.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Kapiaba
Colaborador
Colaborador
Mensagens: 1908
Registrado em: 07 Dez 2012 16:14
Localização: São Paulo
Contato:

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

Mensagem 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.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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

Mensagem 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.
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/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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

Mensagem 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.
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