Passar parâmetro pra thread

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

Moderador: Moderadores

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

Passar parâmetro pra thread

Mensagem por JoséQuintas »

Estou tentando fazer isto funcionar.
É possível?
Não lembro a forma correta de parâmetros pra codeblock.

Código: Selecionar todos

FUNCTION RunModule( cModule, ... )

      hb_ThreadStart( ..., { | ... | Do( cModule, ... } )
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:

Passar parâmetro pra thread

Mensagem por Kapiaba »

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

Passar parâmetro pra thread

Mensagem por JoséQuintas »

Valeu pela intenção.

Como separei parte do aplicativo em LIB, faltava recompilar os fontes na pasta da LIB.
Foi só usar normalmente.

No módulo:

Código: Selecionar todos

   RunModule( "PNOTARELCOMPCLI", "COMPARATIVO", mCodigo )
E na rotina que executa em multithread:

Código: Selecionar todos

FUNCTION RunModule( cModule, cTitulo, a, b, c )

   LOCAL mHrInic

   IF AppIsMultiThread()
      GTSetupFont( .T. )
      hb_ThreadStart( { || DoPrg( cModule, cTitulo, a, b, c ) } )
   ELSE
Em compensação... esqueci que multithread só fica ativado por default na minha senha.... rs

Aqui a intenção é abrir qualquer módulo de qualquer lugar, em uma nova janela.
Como é multithread, nem vou previsar me preocupar com arquivos abertos, variáveis, etc., então multiplica as possibilidades.

Ninguém pediu nada disto, mas aconteceu o seguinte:

Inventei de colocar um alerta na tabela de preços pra valores com margem baixa.
Apareceram valores baixos, e eu estava tentando entender.
Emiti um comparativo mensal, pra ver o quanto era vendido para o cliente, mas era pouco.
Lembrei de pesquisar a rota no google maps, e vi que a empresa ficava no quarteirão do cliente, por isso a margem baixa.
Achei interessante isso tudo, então coloquei tudo como recurso, bastando clicar um botão.

O resultado:
a partir da janela de preço de um cliente, clica num botão, e abre janelas com informações e até um mapa da rota.
Pensar também num gráfico, antes de liberar a novidade.
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

Passar parâmetro pra thread

Mensagem por JoséQuintas »

O passo a passo:

No módulo de preços, acrescentei o pushbutton:

Código: Selecionar todos

   AAdd( oFrm:acMenuOptions, "<Z>Analisa" )
Na minha classe, responsável pelas telas, acrescentei qual seria o desenho:

Código: Selecionar todos

   CASE cCaption == "<Z>Analisa" ;          cSource := "cmdAnalisa";      cTooltip := "Z Análise das informações"
No resource, acrescentei o desenho:

Código: Selecionar todos

cmdAnalisa      ICON     "image\\cmdAnalisa.ico"
Tela resolvida.
icone.png

Depois disso, foi só acrescentar a rotina, que por usar a classe responsável por telas, só acrescentar em UserFunction():

Código: Selecionar todos

METHOD UserFunction( lProcessou ) CLASS JPPRECOClass
...
   CASE ::cOpc == "Z"
      RunModule( "PNOTARELCOMPCLI", "COMPARATIVO", jpcadas->cdCodigo )
E de adicional, no comparativo de vendas, assumir o parâmetro e fazer o serviço.

Código: Selecionar todos

   IF PCount() != 0
      mCliente := mCodCli
      Imprime( mCliente, "S" )
      CLOSE DATABASES
      RETURN
   ENDIF

Ah sim... o problema de multithread não estar sendo usado no cliente.....
Resolvi assim, acrescentando um pCount() na função RunMode(), que abre módulos:

Código: Selecionar todos

   IF AppIsMultiThread() .OR. pCount() > 2
      GTSetupFont( .T. )
      hb_ThreadStart( { || DoPrg( cModule, cTitulo, p1, p2, p3 ) } )
Agora a multithread SEMPRE vale pra módulos extras, estando habilitada ou não (no aplicativo).
É por isso que eu acho interessante multithread, nenhum controle extra pra DBF.
TUDO do aplicativo fica disponível a qualquer instante.
Posso acrescentar essas mesmas chamadas no cadastro de clientes, pedidos, financeiro, etc.

O único "problema" agora é pensar no limite de letras do alfabeto.

Aproveitando:

É isso que chamo de simplificar fontes.
Os fontes de trabalho estão sempre fáceis de mexer.
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

Passar parâmetro pra thread

Mensagem por JoséQuintas »

Fiz ontem, mostrei pro cliente hoje.
Gostou da idéia do mapa: disse que no faturamento ficam pesquisando o google maps pra localizar endereços, e ter a possibilidade de mostrar um mapa vai ser excelente.
Sei não.... acho que vou começar a visitar clientes pra ficar olhando o que eles fazem.
Só assim pra acelerar os recursos....

De qualquer forma, é interessante: estou resolvendo problemas, sem querer, e antes dos clientes pedirem.... rs
E isso foi só porque fiquei curioso por um preço de um cliente deles estar baixo.... rs
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
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Passar parâmetro pra thread

Mensagem por asimoes »

Quintas,

Não entendi nada, kkkk, boiei na maionese, kkkk
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Passar parâmetro pra thread

Mensagem por JoséQuintas »

A alteração de thread foi pra ativar opções extras, abrindo janelas.
Uma das janelas foi um mapa do goole mostrando trajeto.
É justamente uma pesquisa de trajetos que vai ajudar, porque estão fazendo manualmente.

O ponto é que fiz isso de curiosidade, ninguém havia pedido.
Se ninguém pede, mas precisa, se eu tivesse visto isso no cliente, eu teria feito antes.
É possível que precisem de mais coisas e nem tenham pensado que dá pra fazer.
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:

Passar parâmetro pra thread

Mensagem por Kapiaba »

Viajei na maionese 2. kkkkkkkkkkkk
Uma das janelas foi um mapa do goole mostrando trajeto.
Como se faz isso mister Quintas?

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

Passar parâmetro pra thread

Mensagem por JoséQuintas »

Descobri de forma simples: pesquisei um trajeto no google maps, e vi o link que ele gerou.
Algo como www.google.com.br/maps/dir/sdfldsjfdsjd ... fdsfsdfsd/
Vi que entre essas barras tinha cep, endereço, e coordenadas.
Então chutei colocar só CEP e deu certo.

Código: Selecionar todos

      IF jpcadas->cdCepEnt != jpcadas->cdCep
         ShellExecuteOpen( "http://www.google.com.br/maps/dir/" + jpempre->emCep + "/" + jpcadas->cdCepEnt + "/" )
      ELSE
         ShellExecuteOpen( "http://www.google.com.br/maps/dir/" + jpempre->emCep + "/" + jpcadas->cdCep + "/" )
      ENDIF
Poderia colocar em janela do aplicativo, mas não vi necessidade de complicar.
Se fosse janela do aplicativo, seria só criar janela activex, e colocar isso como sendo o activex.

Também testei com mais CEPs e deu certo, não é limitado a apenas dois.

E se for só pra mostrar o mapa: "http://www.google.com.br/maps/place/" + Cep

Mais que isso, só usando API do google e rotina em javascript, poderia ser gerando um html e abrindo, mas ainda não consegui fazer funcionar usando somente CEP.

Como exemplo, o trajeto de ida e volta pra duas entregas:

https://www.google.com.br/maps/dir/0367 ... 03676-080/
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

Passar parâmetro pra thread

Mensagem por JoséQuintas »

Uia, limitei a 20 endereços.
E o usuário pode alterar a ordem do jeito que quiser no mapa.
trajeto.png
A rotina ficou um pouco maior agora.

Código: Selecionar todos

      IF Len( aCepList ) < 2
         MsgExclamation( "Pouco CEP pra criar uma rota" )
      ELSE
         cCmd := "http://www.google.com.br/maps/dir/"
         IF Len( aCepList ) > 20
            ASize( aCepList, 20 )
         ENDIF
         FOR EACH oElement IN aCepList
            cCmd += oElement + "/"
         NEXT
         ShellExecuteOpen( cCmd )
      ENDIF
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

Passar parâmetro pra thread

Mensagem por JoséQuintas »

Versão final... de hoje... rs
Só passar a lista de CEPs.

https://github.com/JoseQuintas/JoseQuin ... lemaps.prg
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

Passar parâmetro pra thread

Mensagem por JoséQuintas »

Exemplos de uso:

Código: Selecionar todos

      IF jpcadas->cdCepEnt != jpcadas->cdCep
         GoogleMaps( { jpempre->emCep, jpcadas->cdCepEnt } )
      ELSE
         GoogleMaps( { jpempre->emCep, jpcadas->cdCep } )
      ENDIF

Código: Selecionar todos

      aCepList := {}
      SELECT rastrea
      GOTO TOP
      DO WHILE ! Eof()
         IF ! Empty( rastrea->raCep )
            AAdd( aCepList, rastrea->raCep )
         ENDIF
         SKIP
      ENDDO
      GoogleMaps( aCepList )
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
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Passar parâmetro pra thread

Mensagem por asimoes »

Pena que o google maps não funcione com activex (internet Explorer)

Fiz um teste aqui com activex deu:

Obs.: a primeira vez que eu executei funcionou depois parou, dando essa mensagem
2017-09-01 18_09_34-.png
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Passar parâmetro pra thread

Mensagem por JoséQuintas »

Esqueceu de posts anteriores?

Ou talvez só funcione em GTWVG... kkkkk
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
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Passar parâmetro pra thread

Mensagem por asimoes »

Consegui abrir o googlemaps com activex
2017-09-01 18_24_43-.png
Tem que setar o registro do windows, segue comandos:

"demo.exe" // é o nome da aplicação que vai ser registrada para funcionar com activex web

Código: Selecionar todos

    nFlagIE := 11001
    
    cKeySrv := "SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION" 
    bRetVal := win_regQuery( WIN_HKEY_LOCAL_MACHINE, cKeySrv, "demo.exe", nFlagIE, .T. )
    
    cKeySrv := "SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_ENABLE_WEB_CONTROL_VISUALS"
    bRetVal := win_regQuery( WIN_HKEY_LOCAL_MACHINE, cKeySrv, "demo.exe", nFlagIE, .T. )

    cKeySrv := "SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_TABBED_BROWSING"
    bRetVal := win_regQuery( WIN_HKEY_LOCAL_MACHINE, cKeySrv, "demo.exe", nFlagIE, .T. )

    cKeySrv := "SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION"
    bRetVal := win_regQuery( WIN_HKEY_LOCAL_MACHINE, cKeySrv, "demo.exe", nFlagIE, .T. )

    cKeySrv := "SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_ENABLE_WEB_CONTROL_VISUALS"
    bRetVal := win_regQuery( WIN_HKEY_LOCAL_MACHINE, cKeySrv, "demo.exe", nFlagIE, .T. )

    cKeySrv := "SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_TABBED_BROWSING"
    bRetVal := win_regQuery( WIN_HKEY_LOCAL_MACHINE, cKeySrv, "demo.exe", nFlagIE, .T. )
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Responder