Página 3 de 5
StartThread()
Enviado: 10 Ago 2020 23:39
por JoséQuintas
Um jeito legal de trabalhar com multithread é usando CLASSE.
Isso permite conversa entre threads.
Não o fonte exato, apenas aproximado, pra dar uma idéia.
Código: Selecionar todos
ExecutaAguarda( { || Seila() } )
FUNCTION ExecutaAguarda( bCode )
o := ProcessoClass():New()
o:Block := bCode
hb_TheadStart( { || o:Execute() } )
DO WHILE ! o:Acabou
Inkey(0.3)
ENDDO
RETURN NIL
CREATE CLASS ProcessoClass
VAR Acabou INIT .F.
VAR Block INIT {}
METHOD Execute() INLINE Eval( ::Block ), ::Acabou := .T.
ENDCLASS
StartThread()
Enviado: 11 Ago 2020 09:37
por asimoes
JoséQuintas escreveu: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.
Eu não uso DBF, uso Hash table, tudo em memória
StartThread()
Enviado: 15 Ago 2020 09:14
por leandrolinauer
Bom dia aSimoes.
Estou migrando para SQL meu sistema e necessito de algo tipo o que tenho com DBF usando TBBROWSE no estilo dbedit() genérico, mas só funciona com DBF, não com array, não consegui fazer um generico para ler array, vc tem um exemplo genérico desta função para abrir qualquer forma de visualização com pesquisa de dados em array?
Eu consegui até alguma coisa passando de SQL para DBF para usar a função genérica e usando thread consegui abrir enquanto ele busca os dados para visualizar, mas agora estou apanhando para fazer algo com que já mostre o que buscou enquanto busca mais dados, para a tela não ficar vazia.
Rodo a pesquisa na função de usuário do dbedit colocando ela em uma variavel publica e executando com aeval()
Se há alguma outra forma de se fazer esta função para usar em array e com pesquisa instantânea, é o que estou tentando fazer e não consegui ainda.
Fico grato
StartThread()
Enviado: 15 Ago 2020 19:25
por JoséQuintas
Se for ADO.....
rs := conexao:Execute( "SELECT ...." )
isso trás os registros, se forem 200.000 registros é instantâneo, ou quase.
Usando AdUseClient, isso se torna LOCAL.
rs:Filter = "NOME LIKE '%JO%'"
O filtro é instantâneo, porque tudo é LOCAL
Vai ficar lento talvez acima de 500.000 registros ou 1 milhão de registros, foi o máximo que testei, coisa de 1 segundo ou 2 pra cada tecla digitada.
StartThread()
Enviado: 15 Ago 2020 19:45
por asimoes
Leandro, eu faço como o Quintas postou, com o resultset você pode alimentar um array, uma hashtable, para exibir em uma grid da hwgui, minigui ou tbrowse do tipo array, se vc for adicionar o resultset em um dbf, serão 2 processamentos, como também será para hashtable, isso depende do exibidor (dbedit, browse, etc) que você irá utilizar
StartThread()
Enviado: 17 Ago 2020 08:44
por leandrolinauer
Bom dia.
Este é o problema mesmo, estou jogando em DBF porque já tenho um TBROWSE para dbf, não tenho um TBROWSE para array genérico, tipo, mando uma matriz com o nome dos campos, mascara e titulo e os mesmos são montados automaticamente no TbColumnNew(), claro vou tentar mas para o projeto de migração continuar, achei mais fácil jogar tudo em um DBF temporário, já consegui e com THREAD(), estou tentando fazer ele atualizar a cada registro e mostrar na tela enquanto o teclado fica livre para digitar, mas não consegui ainda.
Grato
StartThread()
Enviado: 26 Ago 2020 09:22
por juniorcamilo
para eu entender thread e class !(como citado)
utilizo xHB 1.2.3 (Simples) bcc5.82
fiz um exemplo básico a partir do amigo
JoséQuintas escreveu:Um jeito legal de trabalhar com multithread é usando CLASSE.
Isso permite conversa entre threads.
Não o fonte exato, apenas aproximado, pra dar uma idéia.
Código: Selecionar todos
ExecutaAguarda( { || Seila() } )
FUNCTION ExecutaAguarda( bCode )
o := ProcessoClass():New()
o:Block := bCode
hb_TheadStart( { || o:Execute() } )
DO WHILE ! o:Acabou
Inkey(0.3)
ENDDO
RETURN NIL
CREATE CLASS ProcessoClass
VAR Acabou INIT .F.
VAR Block INIT {}
METHOD Execute() INLINE Eval( ::Block ), ::Acabou := .T.
ENDCLASS
resumindo, exemplo que fiz!
Código: Selecionar todos
FUNCTION Main(Envio)
ExecutaAguarda( { || devpos(10,10),devout("OLA MUNDO") } )
return
FUNCTION ExecutaAguarda( bCode )
o := ProcessoClass():New()
o:Block := bCode
StartThread( { || o:Execute() } )
DO WHILE ! o:Acabou
Inkey(0.3)
ENDDO
RETURN NIL
CREATE CLASS ProcessoClass
VAR Acabou INIT .F.
VAR Block INIT {}
METHOD Execute() INLINE Eval( ::Block ), ::Acabou := .T.
ENDCLASS
sem sucesso! fica no loop "DO WHILE ! o:Acabou"!
Obs: isso é novo para mim, não tenho conhecimento ainda!
StartThread()
Enviado: 26 Ago 2020 09:30
por juniorcamilo
acho q descobri o erro!
StartThread( o:Execute() ) e não StartThread( { || o:Execute() } )!
mas mesmo assim enquanto não executar a funcao não libera !
StartThread()
Enviado: 26 Ago 2020 09:40
por Itamar M. Lins Jr.
Ola!
MT no no XHB ? Como estão os nomes das suas libs ?
Saudações,
Itamar M. Lins Jr.
StartThread()
Enviado: 26 Ago 2020 09:46
por juniorcamilo
como uso xdev studio v0.72 do vailton acredito q com a opção mt selecionada ele poe automático a lib!(acho eu)
Preparando Script "E:\JUNIOR\xdevStudio-0.72 debug\scripts\Harbour.xCompiler"...
Script em Anexo.. "Harbour.xCompiler.prg"...
Preset atual .... xHB build 1.2.3 (SimpLex) & BCC 5.82
PATH ... e:\xBase\xharbour123\bin;e:\xBase\bcc582\Bin
INCLUDE. e:\xBase\xharbour123\include;e:\xBase\bcc582\include
LIB .... e:\xBase\xharbour123\lib;e:\xBase\bcc582\lib;e:\xBase\bcc582\lib\psdk
Variaveis de Ambiente:
PATH ... e:\xBase\xharbour123\bin;e:\xBase\bcc582\Bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;c:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn\;c:\Program Files (x86)\Microsoft SQL Server\100\DTS\Binn\;c:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE\;C:\Program Files\dotnet\;C:\Program Files\Microsoft SQL Server\130\Tools\Binn\;C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\170\Tools\Binn\;C:\Users\Junior\AppData\Local\Microsoft\WindowsApps;
INCLUDE. e:\xBase\xharbour123\include;e:\xBase\bcc582\include;e:\JUNIOR\CLIPPER5\INCLUDE;e:\xBase\xharbour123\include;e:\xBase\bcc582\include;
LIB .... e:\xBase\xharbour123\lib;e:\xBase\bcc582\lib;e:\xBase\bcc582\lib\psdk;e:\xBase\bcc582\Lib;e:\xBase\xharbour123\lib;
Executando: harbour.exe "E:\JUNIOR\COMERCIO\MENU.PRG" /q /o"e:\JUNIOR\comercio\objdebug\MENU.c" /M /N /B -DxHB
xHarbour 1.2.3 Intl. (SimpLex) (Build 20150224)
Copyright 1999-2015,
http://www.xharbour.org http://www.harbour-project.org/
Executando: BCC32 -M -c @B32.BC
Borland C++ 5.82 for Win32 Copyright (c) 1993, 2005 Borland
objdebug\MENU.c:
Executando: ILINK32 @B32.BC
Turbo Incremental Link 5.69 Copyright (c) 1997-2005 Borland
Executamos agora o aplicativo gerado com as opções desejadas.
qual a lib a ser usada?
StartThread()
Enviado: 26 Ago 2020 22:11
por sygecom
@juniorcamilo
Não quero te desanimar, mas no xHarbour MT mais cedo ou mais tarde vai perceber que outras parte do seu sistema vai dar pau sem explicação, ele simplesmente faz uma bagunça. Se existe chance, migre para Harbour para usar MT.
Já tentei diversos testes, mas talvez você consiga, boa sorte.
StartThread()
Enviado: 27 Ago 2020 10:09
por asimoes
sygecom escreveu:@juniorcamilo
Não quero te desanimar, mas no xHarbour MT mais cedo ou mais tarde vai perceber que outras parte do seu sistema vai dar pau sem explicação, ele simplesmente faz uma bagunça. Se existe chance, migre para Harbour para usar MT.
Já tentei diversos testes, mas talvez você consiga, boa sorte.
Tem muitos comentários sobre MT no xHarbour, MT não foi bem implementado, melhor dicar é migrar para harbour 3.2 (mais atualizado no momento)
StartThread()
Enviado: 27 Ago 2020 10:10
por juniorcamilo
sygecom escreveu:@juniorcamilo
Não quero te desanimar, mas no xHarbour MT mais cedo ou mais tarde vai perceber que outras parte do seu sistema vai dar pau sem explicação, ele simplesmente faz uma bagunça. Se existe chance, migre para Harbour para usar MT.
Já tentei diversos testes, mas talvez você consiga, boa sorte.
obrigado pela informação!
por onde começo para migrar de xharbour para harbour! tem alguém dos amigos que queira essa empreita?
StartThread()
Enviado: 27 Ago 2020 10:37
por Itamar M. Lins Jr.
Ola!
Só compilar, as funções que por ventura não encontrar podem estar na lib xhb.lib(bcc) ou xhb.a(gcc)
Use gcc.
São poucas funções com o nome trocado.
Veja nos tutorias do José Quintas, como baixar o Harbour.
ou essa:
https://groups.google.com/d/msg/harbour ... 0cppJKAwAJ
Saudações,
Itamar M. Lins Jr.
StartThread()
Enviado: 27 Ago 2020 11:45
por JoséQuintas
Talvez tenha faltado dizer uma coisa:
Se for executado em segundo plano, sem janela, corre o risco de caso aconteça erro, não ver o erro.
De repente até está executando, mas está ocorrendo erro.
Tente ver se tem registro de erro em log, ou acrescente pra gravar erro em arquivo, ou alguma outra alternativa.