oribeiro Posted September 4, 2018 Report Share Posted September 4, 2018 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? Quote Link to comment Share on other sites More sharing options...
aferra Posted September 4, 2018 Report Share Posted September 4, 2018 Coloque um SysRefresh() antes do msgRun() ou no codeblock Quote Link to comment Share on other sites More sharing options...
oribeiro Posted September 4, 2018 Author Report Share Posted September 4, 2018 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 Quote Link to comment Share on other sites More sharing options...
kapiaba Posted September 4, 2018 Report Share Posted September 4, 2018 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 //---------------------------------------------------------------------------// Quote Link to comment Share on other sites More sharing options...
oribeiro Posted September 4, 2018 Author Report Share Posted September 4, 2018 João, Ficou muito legal a tela gradiente. Mas a sua função também congela a aplicação quando o usuário clica duas vezes sobre a mensagem ou sobre a Windows. Resolveria se essa função desse um sysrefresh() de tempos em tempos para mostrar que o sistema está vivo. Quote Link to comment Share on other sites More sharing options...
oribeiro Posted September 5, 2018 Author Report Share Posted September 5, 2018 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 Quote Link to comment Share on other sites More sharing options...
gilmer Posted September 6, 2018 Report Share Posted September 6, 2018 Bom Dia A solução definitiva é thread em rotinas que não é possível colocar sysrefresh Quote Link to comment Share on other sites More sharing options...
oribeiro Posted September 6, 2018 Author Report Share Posted September 6, 2018 Como faço isso? por favor, me dá um exemplo. Quote Link to comment Share on other sites More sharing options...
augustogomes Posted September 8, 2018 Report Share Posted September 8, 2018 Bom Dia A solução definitiva é thread em rotinas que não é possível colocar sysrefresh Bom dia Gilmer. Se tiver um exemplo de como fazer isto, eu já tentei e não consegui, talvez eu não tenha entendido o thread. grato Augusto Quote Link to comment Share on other sites More sharing options...
gilmer Posted September 10, 2018 Report Share Posted September 10, 2018 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. Quote Link to comment Share on other sites More sharing options...
kapiaba Posted September 10, 2018 Report Share Posted September 10, 2018 http://forums.fivetechsupport.com/viewtopic.php?f=3&t=36058 Quote Link to comment Share on other sites More sharing options...
augustogomes Posted September 18, 2018 Report Share Posted September 18, 2018 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 Quote Link to comment Share on other sites More sharing options...
gilmer Posted October 29, 2018 Report Share Posted October 29, 2018 Boa Tarde, Quais erros apresenta? Quote Link to comment Share on other sites More sharing options...
augustogomes Posted June 29, 2019 Report Share Posted June 29, 2019 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 * Quote Link to comment Share on other sites More sharing options...
kapiaba Posted July 1, 2019 Report Share Posted July 1, 2019 Conselho meu: Caia fora de thread em xHarbour. Quote Link to comment Share on other sites More sharing options...
Jmsilva Posted July 1, 2019 Report Share Posted July 1, 2019 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 Quote Link to comment Share on other sites More sharing options...
oribeiro Posted July 1, 2019 Author Report Share Posted July 1, 2019 Muito obrigado pela dica. Vou implementá-la. Quote Link to comment Share on other sites More sharing options...
Jmsilva Posted July 1, 2019 Report Share Posted July 1, 2019 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 Quote Link to comment Share on other sites More sharing options...
oribeiro Posted July 1, 2019 Author Report Share Posted July 1, 2019 Muito bom o codeblock para calcular o Meter. Obrigado. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.