Página 1 de 2

Passar parâmetro pra thread

Enviado: 30 Ago 2017 14:51
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, ... } )

Passar parâmetro pra thread

Enviado: 30 Ago 2017 15:48
por Kapiaba

Passar parâmetro pra thread

Enviado: 30 Ago 2017 17:11
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.

Passar parâmetro pra thread

Enviado: 30 Ago 2017 18:27
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.

Passar parâmetro pra thread

Enviado: 31 Ago 2017 19:37
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

Passar parâmetro pra thread

Enviado: 31 Ago 2017 20:24
por asimoes
Quintas,

Não entendi nada, kkkk, boiei na maionese, kkkk

Passar parâmetro pra thread

Enviado: 31 Ago 2017 21:42
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.

Passar parâmetro pra thread

Enviado: 01 Set 2017 12:07
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.

Passar parâmetro pra thread

Enviado: 01 Set 2017 14:30
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/

Passar parâmetro pra thread

Enviado: 01 Set 2017 15:02
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

Passar parâmetro pra thread

Enviado: 01 Set 2017 15:32
por JoséQuintas
Versão final... de hoje... rs
Só passar a lista de CEPs.

https://github.com/JoseQuintas/JoseQuin ... lemaps.prg

Passar parâmetro pra thread

Enviado: 01 Set 2017 15:41
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 )

Passar parâmetro pra thread

Enviado: 01 Set 2017 18:08
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

Passar parâmetro pra thread

Enviado: 01 Set 2017 18:27
por JoséQuintas
Esqueceu de posts anteriores?

Ou talvez só funcione em GTWVG... kkkkk

Passar parâmetro pra thread

Enviado: 01 Set 2017 18:31
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. )