StartThread()

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

Moderador: Moderadores

Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 8028
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 2 vezes
Curtiram: 1 vez

StartThread()

Mensagem por Itamar M. Lins Jr. »

Ola!
Fatal: Unable to open file 'RTLMT.LIB'
Faltou criar as Libs do Xhb com o "mt" no fnal das libs, tem que recompilar os fontes com essa opção.
É uma "flag" um parâmetro, não achei na internet.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20415
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

StartThread()

Mensagem por JoséQuintas »

Já sei porque precisou do -gtwin.
O meu \xharbour\bin\hbmk.hbc está como GUI

Código: Selecionar todos

d:\xharbour\bin>type hbmk.hbc
gui=yes
strip=yes
compr=yes
José M. C. Quintas
Harbour 3.2, mingw, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (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: 20415
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

StartThread()

Mensagem por JoséQuintas »

Adicional pra quem for usar o hbmk2 no XHarbour:

aqui renomeei o hbmk2.exe pra xhbmk2.exe
e criei um hbmk2.bat

Código: Selecionar todos

@echo off
if "%1" == "-find"     goto :find
if "%1" == "-doc"      goto :find
if "%1" == "-fullhelp" goto :find
if "%1" == "-help"     goto :find
xhbmk2 -xhb %*
goto :fim
:find
xhbmk2 %*
:fim
Tinha me esquecido disso.
Fiz assim pra facilitar quando for fazer algum teste.
A única diferença é ele acrescentar -xhb no comando do hbmk2.
O resto... é pra continuarem funcionando os outros comandos.
E pra quem não sabe, %* é pra indicar todos os parâmetros de uma vez.
Teria limite de 9 se eu indicasse %1 %2 %3 %4 %5 ...
José M. C. Quintas
Harbour 3.2, mingw, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (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/
leandrolinauer
Usuário Nível 3
Usuário Nível 3
Mensagens: 413
Registrado em: 16 Out 2006 10:59
Localização: Paranaíba-MS

StartThread()

Mensagem por leandrolinauer »

Bom dia pessoal.
Estou com o mesmo problema, preciso rodar uma função em segundo plano e não estou conseguindo.
Preciso dar um select no banco de dados sql e passar tudo para dbf para mostrar no dbedit, ou seja, rodar a pesquisa e gravar em dbf em segundo plano já com o dbedit aberto.

Exemplo abaixo busca cliente para pesquisar digitando

Código: Selecionar todos


Function ChecaCli(a_SQL,aTipo,Lin,Col,Tam,FuncC)
Private NomeCampos,UnSelect:=Str(Select(),2)
Private wRow:=Row(),wCol:=Col()
a_SQL:=If(a_SQL=Nil,.F.,a_SQL)

If a_SQL=.T.  //é em sql a pesquisa
   a_Campos  :=FB_pegaEstrutura("TB_COLABORADOR") //pego os campos da tabela colaboradores
   oTempo_DBF:=HoraTmp() //nomeio um temporario
   OpenTmp(a_Campos,"NOME","&oTempo_DBF.",,,,,,,.F.) //crio o temporario vazio com a estrutura do TB_COLABORADOR
   DbSelectArea(oTempo_DBF) //seleciono o temporario
   DBF_CargaTH("TB_COLABORADOR","*","",a_Campos) //dou uma carga no temporario com tudo que tem em TB_COLABORADOR + de 6.000 registros (lento)
EndIf
   NomeCampos:= 
                {{"codigo","Abreviate(nome,60)","venda","ShowSituacao(situacao)","RetVar()","RetRg()","Abreviate(endereco,30)","numero","e_mail","h_page","RP"},;
                {"@R 999999999","@!","@!","@!","@!","@!","@!","@!","@X","@X","@!"},;
                {"CÓDIGO","NOME DO CLIENTE","S","SITUAÇÃO ATUAL DO CLIENTE","CPF/CGC","RG/IEST","ENDEREÇO","NUMERO","EMAIL","HOMEPAGE","RP"}}
                o_MsgR:=" "
   NewDbBusca(04,00,,,"Clientes",NomeCampos,,o_MsgR,,,,,,.T.) // mostro em dbedit o conteudo do temporario no formato acima

Esta função serve só para chamar a modulo_carga em thread

Código: Selecionar todos


Function DBF_CargaTH(oTabela,oPesquisa,oCondicao,oCampos)
Return pThread := hb_StartRead( Modulo_Carga(oTabela,oPesquisa,oCondicao,oCampos) ) //retornando assim da erro
Return pThread := hb_StartRead( {||  Modulo_Carga(oTabela,oPesquisa,oCondicao,oCampos) } ) //retornando assim nao da erro, mas retorna vazio
Return  Modulo_Carga(oTabela,oPesquisa,oCondicao,oCampos) //retornando assim, funciona mas demora, pq são 6.000 registros, por isto colocar em segundo plano, pq aí ele passaria para abrir o dbedit mesmo com poucos dados e iria inserindo enquanto seria pesquisado os clientes, algo assim.

Abaixo monta o banco de dados DBF para mostrar no dbedit

Código: Selecionar todos

Static Function Modulo_Carga(oTabela,oPesquisa,oCondicao,oCampos)
Local i_m,i_l,oCampo,oDados

Local oSQL := DB_SQL_SELECT(oTabela,oPesquisa,oCondicao)

For i_m:= 2 To Len(oSQL) //todo registro começa da linha 2
    DbAppend()
    For i_l:= 1 To Len(oCampos)
        oCampo:=AllTrim(oCampos[i_l,1])
        oDados:=DB_SQL_Fields(oSQL,oCampo,i_m)
        Field->&oCampo. := oDados
    Next
Next
Return .T.
Obs: Não fiz em MATRIZ devido não ter conseguindo montar uma TBROWSE para funcionar genericamente com array, igual a dbedit com dbf, faria isto depois com tempo.

Se alguém souber como colocar em segundo plano em harbour, fico muito agradecido.
Harbour 3.2 + GtWVW + QT + SQLite3 + DBF + SQL (Firebird)
Claudio Soto
Colaborador
Colaborador
Mensagens: 568
Registrado em: 27 Ago 2012 12:31
Localização: Uruguay
Contato:

StartThread()

Mensagem por Claudio Soto »

Hola, probá así a ver si funciona:

Código: Selecionar todos

hb_threadStart( hb_bitOr( HB_THREAD_INHERIT_PUBLIC, HB_THREAD_INHERIT_PRIVATE), @Modulo_Carga(), oTabela, oPesquisa, oCondicao, oCampos ) 
Saludos.
Dr. Claudio Soto
(Uruguay)
http://srvet.blogspot.com
leandrolinauer
Usuário Nível 3
Usuário Nível 3
Mensagens: 413
Registrado em: 16 Out 2006 10:59
Localização: Paranaíba-MS

StartThread()

Mensagem por leandrolinauer »

Bom dia
Testei mas desta forma continua parado aguardando terminar a busca dos dados para depois dar erro
"
Função.............: HB_THREADSTART
Gencode............: 1
Descrição..........: Argument error
"

nThreadId := hb_ThreadStart( hb_bitOr( HB_THREAD_INHERIT_PUBLIC, HB_THREAD_INHERIT_PRIVATE), DBF_CargaTH("TB_COLABORADOR","*","",a_Campos) )

@DBF_CargaTH("TB_COLABORADOR","*","",a_Campos) Não funciona, da erro na compilação falando que "@" não pode ser usado.

Grato
Harbour 3.2 + GtWVW + QT + SQLite3 + DBF + SQL (Firebird)
Claudio Soto
Colaborador
Colaborador
Mensagens: 568
Registrado em: 27 Ago 2012 12:31
Localização: Uruguay
Contato:

StartThread()

Mensagem por Claudio Soto »

Hola,
El @ es para pasar la dirección de la función, es decir para pasar un puntero a la función.
En hb_startThread, los parámetros de la función a ser llamada van después del @ como parámetros de la función hb_startThread
Saludos.
Dr. Claudio Soto
(Uruguay)
http://srvet.blogspot.com
Claudio Soto
Colaborador
Colaborador
Mensagens: 568
Registrado em: 27 Ago 2012 12:31
Localização: Uruguay
Contato:

StartThread()

Mensagem por Claudio Soto »

Hola,
Así seria la forma correcta de llamar tu función:

Código: Selecionar todos

Function DBF_CargaTH(oTabela,oPesquisa,oCondicao,oCampos)
Return pThread := hb_threadStart( hb_bitOr( HB_THREAD_INHERIT_PUBLIC, HB_THREAD_INHERIT_PRIVATE), @Modulo_Carga(), oTabela, oPesquisa, oCondicao, oCampos )
Saludos.
Dr. Claudio Soto
(Uruguay)
http://srvet.blogspot.com
leandrolinauer
Usuário Nível 3
Usuário Nível 3
Mensagens: 413
Registrado em: 16 Out 2006 10:59
Localização: Paranaíba-MS

StartThread()

Mensagem por leandrolinauer »

Boa tarde Soto.
Eu não sabia deste macete, farei da forma que tu me passou e verei hoje a noite o que vai ocorrer.

Gracias.
Harbour 3.2 + GtWVW + QT + SQLite3 + DBF + SQL (Firebird)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20415
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

StartThread()

Mensagem por JoséQuintas »

Chamou a atenção isto:
dou uma carga no temporario com tudo que tem em TB_COLABORADOR + de 6.000 registros (lento)
Local oSQL := DB_SQL_SELECT(oTabela,oPesquisa,oCondicao)
Multithread pra SQL porque 6.000 registros fica lento?
Só se fossem 6 milhões de registros ao invés de 6.000
Tem coisa muito errada nisso aí.

Veja aqui: 25.270 registros, todas as cidades do Brasil

https://pctoledo.org/forum/viewto ... =5&t=24468
José M. C. Quintas
Harbour 3.2, mingw, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (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

StartThread()

Mensagem por asimoes »

Faço assim.

Código: Selecionar todos


nThread  :=  Hb_ThreadStart( Hb_BitOr( HB_THREAD_INHERIT_PUBLIC, HB_THREAD_INHERIT_PRIVATE, HB_THREAD_INHERIT_MEMVARS ), {|| ExecQuery( cQuery, @aDadosCob, @cErro, aChave ) } )

WaitThread( nThread )

FUNCTION ExecQuery( cQuery, aDados, cErro aChave )
LOCAL oRecordSet

   Hb_Default(@aDados, {})
   Hb_Default(@cErro, "")
   Hb_Default(@aChave, {})
   
   IF oConexao:AdoSelect( @oRecordSet, @aDados, cQuery, aChave, , @cErro, , oClPF:ListaFuncoes() ) == 0
   ENDIF

RETURN aDados

FUNCTION WaitThread( nThread )

   DO WHILE .T.
      IF Hb_ThreadWait( nThread, 0.1, .T. ) == 1 
         EXIT
      ENDIF
      hwg_DoEvents()
   ENDDO

RETURN Nil

►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
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

StartThread()

Mensagem por asimoes »

Faço filtro em mais de 1000000 de registros usando thread, demora cerca menos de 2 segundos, a tabela no MAriaDb tem indice que ajuda na consulta
►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
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

StartThread()

Mensagem por asimoes »

O resultado dessa consulta alimenta uma grid da hwgui com tamanho variável, que pode ter 1 linha ou mais de 1000 linhas
►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
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

StartThread()

Mensagem por asimoes »

Uso assim pra não ficar com aquela mensagem "Esta janela não está respondendo", muito feio
►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: 20415
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

StartThread()

Mensagem por JoséQuintas »

Eu comecei usando temporário em DBF, e é muita perda de tempo mesmo.
A consulta ao SQL é 1 segundo, e pra gravar em DBF pode demorar vários minutos.

Usa do jeito que foi retornado, ou, se faz questão de deixar igual DBF, use SQLMIX.

Quanto à mensagem "esta janela não está respondendo", aí é quando o processo é demorado.
Se for 1 ou 2 segundos, dá pra conviver com a mensagem.
José M. C. Quintas
Harbour 3.2, mingw, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (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/
Responder