edutraini Posted February 4, 2022 Report Share Posted February 4, 2022 Boa tarde, Pessoal Tenho um rotina que atualiza alguns dados em um servidor nas nuvens Qual tipo de dialog que posso usar para que assim que usuario clicar para atualizar ele possa minimizar e fazer outras tarefas no sistema Sem ter que ficar preso ate a rotina terminar Obrigado Quote Link to comment Share on other sites More sharing options...
emotta Posted February 4, 2022 Report Share Posted February 4, 2022 Xará não dá, pra funcionar assim teria que ser multithread e isso não funciona legal com xharbour. O que ele tem que fazer é abrir outra instancia do sistema. Quote Link to comment Share on other sites More sharing options...
kapiaba Posted February 4, 2022 Report Share Posted February 4, 2022 Boa tarde, pode sim Edu, use DIALOG AS MDICHILD, ou WINDOW MDICHILD. Veja: http://forums.fivetechsupport.com/viewtopic.php?f=3&t=36244&p=234396&hilit=dialog+mdichild#p234396 Particularmente, eu recomendo JANELAS(WINDOW) MDICHILD, dá mais trabalho, más o controle é total. Se precisar de exemplo, grite. Abs. Regards, saludos. Quote Link to comment Share on other sites More sharing options...
emotta Posted February 5, 2022 Report Share Posted February 5, 2022 Kapiaba vc viu que o problema não é minimizar e abrir outra rotina, o problema e deixar rodando uma rotina processando, minimizar a janela e ir fazendo outra coisa enquanto a rotina roda no background. Como falei, só com multithread pra fazer isso e xharbour não funciona bem nesse ponto. Quote Link to comment Share on other sites More sharing options...
kapiaba Posted February 5, 2022 Report Share Posted February 5, 2022 Vamos esperar ele se pronunciar, outra ideia é por o executável no TRAY(bandeja do windows). Abs. Regards, saludos. Quote Link to comment Share on other sites More sharing options...
emotta Posted February 5, 2022 Report Share Posted February 5, 2022 1 minuto atrás, kapiaba disse: Vamos esperar ele se pronunciar, outra ideia é por o executável no TRAY(bandeja do windows). Abs. Regards, saludos. Ele escreveu isso na pergunta, ele quer minimizar a dialog enquanto a rotina segue processando e na mesma instancia continua fazendo outra coisa enquanto a rotina processa. Colocar na tray tb não é solução pq se está na tray ele não consegue ficar usando a mesma instancia. Como multithread não funciona legal com xharbour, a solução é mesmo abrir outra instancia do executável. Não vejo outra maneira. Quote Link to comment Share on other sites More sharing options...
kapiaba Posted February 5, 2022 Report Share Posted February 5, 2022 "clicar para atualizar ele possa minimizar e fazer outras tarefas no sistema", isso é perfeitamente possível com janelas MDICHILD, eu faço assim. Não consegui dominar a DIALOG AS MDICHILD, mas com WINDOW MDICHILD rola de boas, pelo menos para o meu caso. O usuário abre quantas JANELAS quiser, minimiza e vai para a outra trabalhar, termina, minimiza, abre outra e vai trabalhar, não precisa fechar nada, pois os DIALOGOS ficam NOWAIT e não MODAL FRAME. Vamos esperar ele tentar e se pronunciar, talkey()? Abs. Regards, saludos. Quote Link to comment Share on other sites More sharing options...
emotta Posted February 5, 2022 Report Share Posted February 5, 2022 Legal kapiaba, vms esperar o Edu se pronunciar sim, com certeza. Mas enquanto ele não o faz me tira uma dúvida: nessa sua sugestão vc consegue deixar gerando um relatório que demora uns 5min pra processar, e enquanto está processando vc minimiza a dialog e, sem abrir outro executável, abrir o cadastro de cliente e incluir um novo cliente? Veja bem, tudo isso no mesmo executável, sem abrir outra instancia. Eu pergunto isso pois foi isso que entendi da necessidade do Edu, que pode ser um relatório ou algum processamento mais demorado, que em vez do usuário abrir outro executável pra fazer outra operação ele deseja apenas minimizar e fazer outras coisas enquanto o processamento ocorre. Tudo isso sem abrir um novo executável. E aí Edu, entendi errado o q vc pediu? Quote Link to comment Share on other sites More sharing options...
edutraini Posted February 5, 2022 Author Report Share Posted February 5, 2022 Boa tarde Emotta e Kapi Consegui fazer da seguinte forma. Peguei o exemplo que kapi e adptei Aparentemente funcionando perfeitamente So precisa tomar cuidado com o nome da variavel para nao misturar com outro programa que vai abrir function tabela_precos() local oBarPreco, oMenuPreco private pr_pro1,pr_pro2,pr_pro3,pr_pro4,pr_pro5,pr_reser SetGetColorFocus() DEFINE WINDOW oWndpreco FROM 19, 82 TO 20, 70 TITLE "Tabela de Precos " ACTIVATE WINDOW oWndPreco on init browse_precos( AS_DIALOG ) owndpreco:end() return nil function browse_precos( nAs) local oDlgpre, oCbx, oChk, oFontpre, oBrushpre local cVar1, cVar2, cVar3 local lSwitch1, lSwitch2, lSwitch3 local cVar := "Two" local aGrad := {{1, CLR_WHITE, CLR_HBLUE }} pr_pro1:=spac(20) pr_pro2:=spac(2) pr_pro3:=0.00 pr_pro4:=0.00 pr_pro5:=spac(3) pr_reser :=0 cVar1 := cVar2 := Space( 50 ) lSwitch1 := lSwitch2 := lSwitch3 := .f. * IF SELECT("prepre") != 0 prepre->(DbCloseArea()) ENDIF if m->sql = "S" USE DPROPRO0 shared INDEX XPROPRO1,XPROPRO2 ALIAS PREPRE NEW via "Sqlrdd" Else USE DPROPRO0 INDEX XPROPRO1,XPROPRO2 ALIAS PREPRE NEW Endif dbsetorder(2) * DEFINE BRUSH oBrushpre GRADIENT aGrad DEFINE FONT oFontpre NAME "Segoe UI" SIZE 0,-12 DEFINE DIALOG oDlgpre RESOURCE "MDIDLG" FONT oFontpre TITLE "Tabela de Preços" BRUSH oBrushpre RELEASE FONT oFontpre RELEASE BRUSH oBrushpre REDEFINE SAY oSayPre6 VAR prepre->estqatual PICTURE "999999.999" ID 26 OF oDlgpre FONT FT_ESTQ REDEFINE SAY oSayPre7 VAR pr_reser PICTURE "999999.999" ID 27 OF oDlgpre FONT FT_ESTQ REDEFINE SAY oSayPre8 VAR prepre->estqatual-pr_reser PICTURE "999999.999" ID 28 OF oDlgpre FONT FT_ESTQ REDEFINE SAY oSayPre9 VAR prepre->estqcpa PICTURE "999999.999" ID 29 OF oDlgpre FONT FT_ESTQ REDEFINE SAY oSayPre10 VAR prepre->Texto MEMO ID 4004 OF oDlgpre update * REDEFINE listbox oBrwPre ; FIELDS STR(PREPRE->CODPROD,7)+'-'+PREPRE->LOTE,; PREPRE->TIPO,; PREPRE->SECAO,; PREPRE->BITOLA,; PREPRE->ACAB,; TRANS(PREPRE->ESTQATUAL,"999999.999"),; PREPRE->OBS,; PREPRE->LOCAL,; TRATAMENTO(PREPRE->TRATAMENTO),; STR(PREPRE->COMPRIMENT,6)+" a "+STR(PREPRE->COMPRIMENF,6),; PREPRE->FORNECEDOR,; PREPRE->CORRIDA+' '+PREPRE->SEQCORRIDA ; HEADERS 'Código','Tipo','SE','Bitola','Acab','Estq.Atual','Observacao','Local','Tratamento','Comprimento','Fornecedor','Corrida'; SIZES 50,150,30,120,35,60,100,50,50,80,100,80; ALIAS PREPRE->(Alias()) ID 150 OF oDlgpre UPDATE WITH OBJECT oBrwPre :aJustify :={.t.,.f.,.f.,.f.,.f.,.t.,.f.,.f.,.f.,.f.,.f.,.f.,.f.} :bChange := {|| ESTQ_VENDA(prepre->codprod,prepre->lote,@pr_reser),oSaypre6:Refresh(),oSaypre7:Refresh(),oSaypre8:Refresh()} :bClrStd := {|| iif(prepre->marcalista=.t.,{CLR_BLACK,nRGB(255,0,0)},{CLR_BLACK,CLR_WHITE})} END REDEFINE GET oGetPre1 VAR pr_pro1 ID 1020 OF oDlgpre PICTURE "@!" VALID BuscaPro(pr_pro1,pr_pro2,pr_pro3,pr_pro4,pr_pro5,IF(M->BUSCA_PROD="2","6","1"),oBrwPre) REDEFINE COMBOBOX oGetPre2 VAR pr_pro2 ITEMS vn_TPsecao ID 1015 OF oDlgpre VALID BuscaPro(pr_pro1,pr_pro2,pr_pro3,pr_pro4,pr_pro5,IF(M->BUSCA_PROD="2","6","1"),oBrwPre) REDEFINE GET oGetPre3 VAR pr_pro3 ID 1005 OF oDlgpre PICTURE "9999.99" VALID BuscaPro(pr_pro1,pr_pro2,pr_pro3,pr_pro4,pr_pro5,IF(M->BUSCA_PROD="2","6","1"),oBrwPre) REDEFINE GET oGetPre4 VAR pr_pro4 ID 18 OF oDlgpre PICTURE "9999.99" VALID BuscaPro(pr_pro1,pr_pro2,pr_pro3,pr_pro4,pr_pro5,IF(M->BUSCA_PROD="2","6","1"),oBrwPre,xsetfocus(oBrwPre) ) REDEFINE SAY ID 1200 OF oDlgpre TRANSPARENT COLOR CLR_WHITE,CLR_WHITE REDEFINE BTNBMP PROMPT "FECHAR" ID 2001 OF oDlgpre CENTER 2007 ACTION (oDlgpre:End(),oWndPreco:end()) REDEFINE BUTTON oPrePre1 ID 4011 OF oDlgpre ACTION(Kardex(prepre->codprod,prepre->lote),oBrwPre:SetFocus()) // Mostra Ficha Kardex if nAs == AS_MDICHILD ACTIVATE DIALOG oDlgpre AS MDICHILD ; ON PAINT oDlgpre:Box( 8,8, 373, 584, CLR_HRED ) ; ON RIGHT CLICK MsgInfo( oDlgpre:ClassName(), "oDlgpre:ClassName" ) elseif nAs == AS_DIALOG ACTIVATE DIALOG oDlgpre CENTERED endif return oDlgpre Quote Link to comment Share on other sites More sharing options...
emotta Posted February 5, 2022 Report Share Posted February 5, 2022 Edu se colocar isso em produção e funcionar bem reporte aqui por favor. Tudo está rodando na mesma thread e em todos testes que já fiz de coisas semelhantes, inclusive multithread, tive problemas. Mas se der certo em produção tenho que tirar o chapéu pro Kapiaba, procurei uma solução dessa por anos e nunca encontrei. Quote Link to comment Share on other sites More sharing options...
edutraini Posted February 5, 2022 Author Report Share Posted February 5, 2022 Edu to fazendo os testes aqui e aparentemente perfeito ele cria uma outra janela e fica la a dialog presa executando eu minimizo essa janela e volta para principal e continuo trabalhando qq coisa me chamo zap ai vc entra na minha maquina para ver se é isso que vc quer Quote Link to comment Share on other sites More sharing options...
emotta Posted February 5, 2022 Report Share Posted February 5, 2022 Edu tá tranquilo, estou com o sistema na web agora, uso o xharbour console apenas pra fazer processamento de fila apenas. A versão desktop que tínhamos foi descontinuada Mas se isso realmente funcionar bem eu queria ter visto a 10 anos atrás, teria sido importante pois foi qdo fiz os testes de multithread em que o objetivo era exatamente esse (na época). Em aplicações web a coisa muda completamente, é praticamente nativo possibilitar o usuário abrir várias janelas no browser e processar coisas em paralelo. Quote Link to comment Share on other sites More sharing options...
kapiaba Posted February 5, 2022 Report Share Posted February 5, 2022 Very good Edu. Agora, para ficar mais Show(), coloque uma xBrowse() no lugar da wBrowse(), para veres o show() de pelota que é o xBrowse(). Depois, com mais tempo, teste janelas MDI com MDICHILD, todo o seu sistema fica como se fosse o xDev.exe do Vailton, usuário ilimitado. Abre, minimiza, abre, minimiza, maximiza, impede abir a mesma janela novamente(parece difícil, mas não é), fecha a que quiser ou só fecha todas as janelas ao sair do programa principal. Só faço programas assim agora. Nada de diálogos FIXOS. Abs. Regards, saludos. Quote Link to comment Share on other sites More sharing options...
Jmsilva Posted February 5, 2022 Report Share Posted February 5, 2022 4 horas atrás, kapiaba disse: Very good Edu. Agora, para ficar mais Show(), coloque uma xBrowse() no lugar da wBrowse(), para veres o show() de pelota que é o xBrowse(). Depois, com mais tempo, teste janelas MDI com MDICHILD, todo o seu sistema fica como se fosse o xDev.exe do Vailton, usuário ilimitado. Abre, minimiza, abre, minimiza, maximiza, impede abir a mesma janela novamente(parece difícil, mas não é), fecha a que quiser ou só fecha todas as janelas ao sair do programa principal. Só faço programas assim agora. Nada de diálogos FIXOS. Abs. Regards, saludos. Por Kapiaba, gostei da sua expertise! Conheço uso da MDI, mas não pensei da forma e objetivo que vc usou. Eu uso multithread para fazer processamento paralelo, no meu caso funciona bem, apesar do @Emotta dizer que tem problemas. Quote Link to comment Share on other sites More sharing options...
kapiaba Posted February 5, 2022 Report Share Posted February 5, 2022 3 minutos atrás, Jmsilva disse: Por Kapiaba, gostei da sua expertise! Conheço uso da MDI, mas não pensei da forma e objetivo que vc usou. Eu uso multithread para fazer processamento paralelo, no meu caso funciona bem, apesar do @Emotta dizer que tem problemas. Não faço nem ideia do que seja multithread, nunca vi um exemplo na prática. Poderias por favor provocar meu cérebro de minhocas e mostrar algo na prática? Não que eu vá usar, mas conhecimento, dinheiro e várias mulheres( Rochinhas, infarta. kkkkkkk ) nunca é demais. kkkkkkkkkkkkkk Obg. abs. Regards, saludos. Quote Link to comment Share on other sites More sharing options...
emotta Posted February 5, 2022 Report Share Posted February 5, 2022 11 minutos atrás, Jmsilva disse: Por Kapiaba, gostei da sua expertise! Conheço uso da MDI, mas não pensei da forma e objetivo que vc usou. Eu uso multithread para fazer processamento paralelo, no meu caso funciona bem, apesar do @Emotta dizer que tem problemas. Eu tive experiências ruins com multithread em xharbour, mas em harbour usei com sucesso. Vc tá usando bem em xharbour ou harbour? Quote Link to comment Share on other sites More sharing options...
emotta Posted February 6, 2022 Report Share Posted February 6, 2022 8 minutos atrás, kapiaba disse: Não faço nem ideia do que seja multithread, nunca vi um exemplo na prática. Poderias por favor provocar meu cérebro de minhocas e mostrar algo na prática? Não que eu vá usar, mas conhecimento, dinheiro e várias mulheres( Rochinhas, infarta. kkkkkkk ) nunca é demais. kkkkkkkkkkkkkk Obg. abs. Regards, saludos. Se for pra usar em xharbour não recomendo, embora o JMsilva diga o contrário. Mas no meu caso tive problemas com o sistema fechando do nada por nenhum motivo aparente. Em harbour funciona legal, tanto é que tive um aplicativo de catracas comunicando simultaneamente com várias via TCP/IP. Então em Harbour vc vai conseguir ter sucesso Multithread é uma forma de vc criar vários processos dentro do mesmo executável (único PID) e com memória separada pra cada thread. Por exemplo: vc pode colocar o sistema pra fazer uma atualização de preços e em paralelo colocar pra gerar um relatório, mesmo a rotina de atualização de preço ainda sendo processada. O fato da sua solução ter funcionado me deu um nó na cabeça pq não está separando a memória entre os processos, talvez por isso o Edu tenha mencionado que as variáveis tem que ter outros nomes pra não dar erro. Se vc se interessar eu posto uns exemplos aqui posteriormente, aí vc vai ver na prática. Faça o teste em xharbour e dps em harbour, no meu caso só tive sucesso em harbour. Quote Link to comment Share on other sites More sharing options...
emotta Posted February 6, 2022 Report Share Posted February 6, 2022 Divirta-se Kapiaba. https://github.com/harbour/core/tree/master/tests/mt Quote Link to comment Share on other sites More sharing options...
kapiaba Posted February 6, 2022 Report Share Posted February 6, 2022 14 horas atrás, emotta disse: Divirta-se Kapiaba. https://github.com/harbour/core/tree/master/tests/mt Gracias Emotta, eu não entendi nada. Tem um monte de .PRGs e outros arquivos, mas não tem a área de download. É para baixar um por um? Obg. abs Regards, saludos. 14 horas atrás, emotta disse: Quote Link to comment Share on other sites More sharing options...
kapiaba Posted February 6, 2022 Report Share Posted February 6, 2022 Vixyyyyy, já começou mal no primeiro teste, compilando com Harbour: Application =========== Path and name: C:\FWH1905\samples\MULTI01.exe (32 bits) Size: 3,976,704 bytes Compiler version: Harbour 3.2.0dev (r1603082110) FiveWin version: FWH 19.05 C compiler version: Borland/Embarcadero C++ 7.0 (32-bit) Windows version: 6.1, Build 7601 Service Pack 1 Time from start: 0 hours 0 mins 1 secs Error occurred at: 02/06/22, 11:28:25 Error description: Error BASE/3012 Argument error: HB_THREADJOIN Args: [ 1] = U [ 2] = U Stack Calls =========== Called from: => HB_THREADJOIN( 0 ) Called from: MULTI01.prg => MAIN( 22 ) /* * demonstration/test code for thread return complex values * and detached locals created by thread and used after thread * termination. * * Copyright 2008 Przemyslaw Czerpak <druzus / at / priv.onet.pl> * */ #include "FiveWin.ch" #ifdef __XHARBOUR__ #xtranslate hb_threadStart( <x,...> ) => StartThread( <x> ) #xtranslate hb_threadJoin( <x,...> ) => JoinThread( <x> ) #endif static s_var proc main() local xResult ? Version() ? "join:", hb_threadJoin( hb_threadStart( @thFunc() ), @xResult ) ? "result:", xResult ? "static var type:", valtype( s_var ) ? eval( s_var ) ? eval( s_var ) return func thFunc() local i := 12345.678 s_var := {|| i++ } return replicate( "Hello World!!! ", 3 ) Regards, saludos. Quote Link to comment Share on other sites More sharing options...
emotta Posted February 6, 2022 Report Share Posted February 6, 2022 2 horas atrás, kapiaba disse: Vixyyyyy, já começou mal no primeiro teste, compilando com Harbour: Application =========== Path and name: C:\FWH1905\samples\MULTI01.exe (32 bits) Size: 3,976,704 bytes Compiler version: Harbour 3.2.0dev (r1603082110) FiveWin version: FWH 19.05 C compiler version: Borland/Embarcadero C++ 7.0 (32-bit) Windows version: 6.1, Build 7601 Service Pack 1 Time from start: 0 hours 0 mins 1 secs Error occurred at: 02/06/22, 11:28:25 Error description: Error BASE/3012 Argument error: HB_THREADJOIN Args: [ 1] = U [ 2] = U Stack Calls =========== Called from: => HB_THREADJOIN( 0 ) Called from: MULTI01.prg => MAIN( 22 ) /* * demonstration/test code for thread return complex values * and detached locals created by thread and used after thread * termination. * * Copyright 2008 Przemyslaw Czerpak <druzus / at / priv.onet.pl> * */ #include "FiveWin.ch" #ifdef __XHARBOUR__ #xtranslate hb_threadStart( <x,...> ) => StartThread( <x> ) #xtranslate hb_threadJoin( <x,...> ) => JoinThread( <x> ) #endif static s_var proc main() local xResult ? Version() ? "join:", hb_threadJoin( hb_threadStart( @thFunc() ), @xResult ) ? "result:", xResult ? "static var type:", valtype( s_var ) ? eval( s_var ) ? eval( s_var ) return func thFunc() local i := 12345.678 s_var := {|| i++ } return replicate( "Hello World!!! ", 3 ) Regards, saludos. No script de compilação vc precisa setar que o executável gerado será multithread. Precisa pesquisar como faz essa setagem pq eu não me lembro o de tem que mudar. 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.