Jump to content
Fivewin Brasil

Mensagem "não respondendo" em msgrun


oribeiro

Recommended Posts

Pessoal,

Quando a tarefa demora muito para executar dentro do MSGRUN() se tem título, aparece no cabeçalho da "Aplicação não respondendo" se não tem e o usuário clica sobre a mensagem do MSGRUN ele congela a aplicação. Se o usuário esperar o code block do msgrun ir até o final volta tudo ao normal, mas antes disso, dá mesmo a impressão de que o sistema está travado.

Existe algum outro MSGRUN que evite essa situação ou que mostre uma barra de execução ou algo que mostre ao cliente que o sistema não está travado?

 

Link to comment
Share on other sites

Obrigado pela sugestão, mas não resolveu.Nem

Nem antes do MsgRun, nem antes do lOkZip :=

SysRefresh()
MsgRun("Atenção: O Sistema não travou! Essa rotina demorará por causa do tamanho do seu banco de dados. Aguarde até a conclusão.",,{ | oDlg | ;
                lOkZip := hb_ZipFile( cFolderTargetZip  ,; // ZipFile (nome do zip)
                                      acFiles           ,; // File to Compress, pode ser array
                                      HBL_ZIPLEVEL      ,; // Nivel de compressão
                                      bOnZipFile        ,; // Codeblock a executar enquanto comprime
                                      XBL_ZIPOVERWRITE  ,; // Overwrite
                                      "12345"           ,; // Password
                                      XBL_ZIPWITHPATH   ,; // Armazena caminho (PATH)
                                      NIL             ) }) // Codeblock para file progress

 

Link to comment
Share on other sites

Tente como o meu.

#Include "FiveWin.Ch"
	//----------------------------------------------------------------------------//
	// http://forums.fivetechsupport.com/viewtopic.php?f=3&t=34020
	function MsgRun( cCaption, cTitle, bAction, oWndParent )  // MUDEI: 24/07/2017 - Joao
	   LOCAL oDlg, nWidth, uReturn, aGrad
	   DEFAULT cCaption := "Por Favor, Espere...", ;
           bAction  := { || WaitSeconds( 1 ) }
	   // Modelos de gradient
   // aGrad := { { 0.5, CLR_HRED,CLR_WHITE},{ 0.5,CLR_WHITE,CLR_HRED } }
	   // aGrad := { { 0.30, CLR_HRED, CLR_WHITE},{ 0.70, CLR_WHITE, CLR_HRED } }
	   // gostei assim, mas gosto e que nem friozo... cada um tem o seu... kkkkkkk
   aGrad := { { 0.30, CLR_BLACK, CLR_YELLOW},{ 0.70, CLR_YELLOW, CLR_BLACK } }
	   /* // assim, todos os dialogos assumem o gradiente, nao gostei.
      // Nao testei na window(janela) creio fique show().
   SetDlgGradient( { {0.30,CLR_HRED,CLR_WHITE}, {0.70,CLR_WHITE,CLR_HRED} } )
   */
	   DEFINE FONT oFnt  NAME "Ms Sans Serif" SIZE 0, -12 BOLD
   DEFINE FONT oFont NAME "Ms Sans Serif" SIZE 0, -14 BOLD
	   IF cTitle == NIL
	      DEFINE DIALOG oDlg GRADIENT aGrad           ; // usando gradient
             FROM 0,0 TO 3, Len( cCaption ) + 4   ;
             STYLE nOr( DS_MODALFRAME, WS_POPUP )
	   ELSE
	      DEFINE DIALOG oDlg GRADIENT aGrad           ; // usando gradient
             FROM 0,0 TO 4, Max( Len( cCaption ), Len( cTitle ) ) + 4 ;
             TITLE cTitle ;
             STYLE DS_MODALFRAME
	   ENDIF
	   oDlg:bStart := { || uReturn := Eval( bAction, oDlg ), oDlg:End(), SysRefresh() }
   oDlg:cMsg   := cCaption
	   nWidth := oDlg:nRight - oDlg:nLeft
	   SET FONT OF oDlg TO oFnt
	   ACTIVATE DIALOG oDlg ON PAINT oDlg:SayText( oDlg:cMsg ) ;
            ON INIT oDlg:Center( oWndParent )
	return uReturn
	//---------------------------------------------------------------------------//
	Function WaitSeconds( nSecs )
	    Local nStart := GetTickCount()
	    DEFAULT nSecs := 1
	    While GetTickCount() - nStart < ( 1000 * nSecs )
    Enddo
	Return Nil
	//---------------------------------------------------------------------------//
	Function MsgWait( cCaption, cTitle, nSeconds )
	    DEFAULT nSeconds := 4
	Return MsgRun( cCaption, cTitle, { || WaitSeconds( nSeconds ) } )
	//---------------------------------------------------------------------------//
	Function StopUntil( bBlock )
	    DO WHILE !Eval( bBlock )
       WaitMessage()
       SysRefresh()
    ENDDO
	Return Nil
	//---------------------------------------------------------------------------//

Link to comment
Share on other sites

Fiz uma função bem interessante para substituir o MsgWait que também dava a impressão de que o sistema estava travado.

Será que dá para fazer algo parecido com o MsgRun? Eu ainda não consegui. 

Vejam:

*******************************************************************************************
Function MsgWait1( cCaption, cTitle, nSeconds, lBot, bAction ) // MsgWait com "botão" de sair e "função" -> Exemplo: MsgWait1("cCaption", "cTitle", 5, .T., {||File("xxx.txt")} ) // o code block deve retornar (.T.)
*******************************************************************************************
   LOCAL oDlg, oProg1, oSay, oBtn, bOk, nInicio:=0
   cCaption := iif(ValType(cCaption)#"C", "Por favor, aguarde...",                   cCaption) // Mensagem para a janela
   cTitle   := iif(ValType(cTitle  )#"C", "(OASyS) Mensagem com espera programada.", cTitle  ) // Título para a janela
   nSeconds := iif(ValType(nSeconds)#"N", 5,                                         nSeconds) // Quantos segundos a janela ficará aberta
   lBot     := iif(ValType(lBot    )#"L", .F.,                                       lBot    ) // O Botão de Fechar será liberado? Se informado um Code Block será será oculto.
   bAction  := iif(ValType(bAction )#"B", "",                                        bAction ) // Code Block a ser executado. Exemplos: {|| Funcao() } ou {|| File("ent.txt") }   // A ação deve sempre retornar (.T.) no fim da execução
   PRIVATE n       := 0
   PRIVATE lBtn    := .F.
   PRIVATE lAction := ValType(bAction)="B"
   PRIVATE lRet    := iif(lAction, .F., .T.)
   DEFINE DIALOG oDlg SIZE 400,300 COLOR CLR_BLUE,CLR_HGRAY FONT oFontGet TITLE cTitle STYLE DS_MODALFRAME PIXEL
   @ 001,001 GROUP TO 109,199 FONT oFontSay TRANSPARENT PIXEL
   @ 110,001 GROUP TO 138,199 FONT oFontSay TRANSPARENT PIXEL
   @ 120,008 METER oProg1 VAR nInicio TOTAL nSeconds NOPERCENTAGE SIZE 145,011 PIXEL
   @ 120,159 BUTTON oBtn PROMPT "&Fechar" SIZE 35,12.5 ACTION (lBtn:=.T., n:=nSeconds) WHEN lBot PIXEL CANCEL
   @ 010,008 SAY oSay PROMPT cCaption SIZE 189,092 COLOR CLR_RED,CLR_HGRAY PIXEL
   oBtn:cToolTip:="Atenção: Se você fechar essa tela eu não vou conseguir executar a tarefa e algo pode sair errado."
   ACTIVATE DIALOG oDlg CENTER ON INIT oDlg:bStart:={|| Increase(oDlg, oProg1, nSeconds, bAction) }
Return( lRet )
Static Function Increase(oDlg, oProg1, nSeconds, bAction)
   oDlg:Refresh()
   For n=0 To nSeconds
      oProg1:Set( n )
      oProg1:cText := "Essa tela fechará em "+Alltrim(Str(nSeconds - n))+" segundos."
      if lAction                 // Se houver um code block a ser executado:
         if      Eval( bAction ) // - Verifica se a tarefa foi executada.
            lRet := .T.
            Exit
         elseif  n=nSeconds      // - Recomeça a contagem caso não tenha executado a tarefa ainda..
            if lBtn .AND. !MsgYesNo("Eu ainda não consegui terminar a tarefa que fui programado para executar, devo continuar até a conclusão?","(OASyS) Estou tentando executar uma tarefa importante.")
               Exit
            endif
            lBtn := .F.
            n    := 0
            oProg1:Set( n )
            oProg1:cText := "Essa tela fechará em "+Alltrim(Str(nSeconds))+" segundos."
            SysRefresh()
         endif
      endif
      WaitSeconds( 1 )
   Next
   oDlg:End()
Return nil

 

Link to comment
Share on other sites

  • 2 weeks later...
 

Bom Dia,

  Verifique este material https://pt.stackoverflow.com/questions/95233/o-que-é-uma-thread-como-ela-funciona

 

Irei pegar alguns exemplos do samples e postar. 

Outro detalhe importante, thread do harbour é melhor que xharbour.

 

 

Obrigado Gilmer, vi o material e entendi como funciona mas não estou conseguindo compilar com o xharbour, peguei uns exemplos que você postou em outro tópico 

porém não consigo compilar, quais libs tenho que adicionar para compilar estes exemplos?

Grato

Augusto

 

Link to comment
Share on other sites

  • 1 month later...
  • 8 months later...

 

 

Boa Tarde,

Quais erros apresenta?

 

 

 

Apresenta este erro, não acha estas funções

 

mthread.c:
Turbo Incremental Link 6.80 Copyright (c) 1997-2017 Embarcadero Technologies, Inc.
Error: Unresolved external '__endthreadex' referenced from X:\XHARBOUR_NOVO\LIB\VMMT.LIB|threadmt
Error: Unresolved external '__beginthreadex' referenced from X:\XHARBOUR_NOVO\LIB\VMMT.LIB|threadmt
Error: Unable to perform link
* Linking errors *

Link to comment
Share on other sites

Olá Ribeiro, tenho algumas alternativas, veja esta te atende, mudança do cursor.

Function fw_ziper1()
   Local lOkZip
	Local cFolderTargetZip :=  "C:\temp\test.zip"
	Local acFiles := "C:\temp\TeamViewer_Setup.exe"
	Local bOnZipFile := {|| CursorWait()}


   MsgRun("Atenção: O Sistema não travou! Essa rotina demorará por causa do tamanho do seu banco de dados. Aguarde até a conclusão.",,{ || ;
                lOkZip := hb_ZipFile( cFolderTargetZip  ,; // ZipFile (nome do zip)
                                      acFiles           ,; // File to Compress, pode ser array
                                      9                 ,; // Nivel de compressão
                                      bOnZipFile        ,; // Codeblock a executar enquanto comprime
                                      .t.               ,; // Overwrite
                                      "12345"           ,; // Password
                                      nil               ,; // Armazena caminho (PATH)
                                      NIL             ) }) // Codeblock para file progress

    CursorArrow()
Return nil

 

Link to comment
Share on other sites

Se quiser incrementar a rotina hb_zipfile() e sair for msgrun(), vai uma sugestão:

STATIC FUNCTION fw_ziper4()
   LOCAL oDlg,oMeter,oText,cMsg,nActual
   Local lOkZip
   Local cFolderTargetZip :=  "C:\temp\test.zip"
   Local aFiles:={}
	
   AEval(Directory("c:\temp\*.dbf"),{|x| AAdd(aFiles,"c:\temp\"+x[1])})
   FErase(cFolderTargetZip)

   DEFINE DIALOG oDlg FROM 1, 1 TO 10, 60 TITLE "Espere comprimindo arquivos"

   @ 0.5, 2  SAY oText VAR cMsg SIZE 180, 20 OF oDlg
   @ 2, 2 METER oMeter VAR nActual TOTAL 100 OF oDlg SIZE 200, 20

   oDlg:bStart:={||;
	              lOkZip := Hb_ZIPFILE(cFolderTargetZip,;
				  aFiles,;
				  9,;
	              {|cFile| oText:SetText(cFile)},;
				  .t.,;
				  "12345",;
				  nil,;
				  nil,;
	             {|nPos,nCur| nActual := (nPos/nCur*100),oMeter:Set(nActual)}),;
                 oDlg:End()} 

   ACTIVATE DIALOG oDlg ON INIT self:Center(oWnd)
	
	If lOkZip
		MsgInfo("ok")
	Else
		MsgStop("erro")
	Endif	
		

RETURN lOkZip

 

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...