StartThread()

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

StartThread()

Mensagem 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
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

StartThread()

Mensagem 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
►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)
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 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
Harbour 3.2 + GtWVW + QT + SQLite3 + DBF + SQL (Firebird)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

StartThread()

Mensagem 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.
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

StartThread()

Mensagem 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
►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)
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.
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
Harbour 3.2 + GtWVW + QT + SQLite3 + DBF + SQL (Firebird)
Avatar do usuário
juniorcamilo
Usuário Nível 3
Usuário Nível 3
Mensagens: 343
Registrado em: 10 Nov 2006 09:12
Localização: Pará

StartThread()

Mensagem 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!
Avatar do usuário
juniorcamilo
Usuário Nível 3
Usuário Nível 3
Mensagens: 343
Registrado em: 10 Nov 2006 09:12
Localização: Pará

StartThread()

Mensagem 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 !
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

StartThread()

Mensagem por Itamar M. Lins Jr. »

Ola!
MT no no XHB ? Como estão os nomes das suas libs ?

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
juniorcamilo
Usuário Nível 3
Usuário Nível 3
Mensagens: 343
Registrado em: 10 Nov 2006 09:12
Localização: Pará

StartThread()

Mensagem 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?
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

StartThread()

Mensagem 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.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
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 »

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)
►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
juniorcamilo
Usuário Nível 3
Usuário Nível 3
Mensagens: 343
Registrado em: 10 Nov 2006 09:12
Localização: Pará

StartThread()

Mensagem 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?
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

StartThread()

Mensagem 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.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

StartThread()

Mensagem 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.
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/
Responder