Página 1 de 1
Como seria isto sem multithread?
Enviado: 27 Fev 2017 15:47
por JoséQuintas
Como seria feita a mesma coisa sem usar multihread?
Quais as alterações necessárias nos fontes?
Nota: Compilei usando HMG Extended modificada
Como seria isto sem multithread?
Enviado: 27 Fev 2017 19:59
por asimoes
Quintas,
Perguntas:
1-Qual versão da minigui você está usando
2-Este exemplo você compilou com a Minigui Extended com mingw ou bcc 5?
Como seria isto sem multithread?
Enviado: 27 Fev 2017 20:27
por JoséQuintas
Aqui só uso Harbour 3.4, então pras LIBs resta usar mingw.
Esse exemplo está na pasta \hmgs\samples\applications\phone_book
Mas tanto minha HMG Extended 17.01 quanto esse exemplo estão modificados.
A HMG Extended original não aceita isso de multithread.
A minha só pra testes....
Como seria isto sem multithread?
Enviado: 27 Fev 2017 22:32
por asimoes
Ok.
Você gerou as libs com mingw ?
Tem como você mostrar como gerou as libs?
Como seria isto sem multithread?
Enviado: 28 Fev 2017 00:19
por Nascimento
JoséQuintas Nota: Compilei usando HMG Extended modificada
que você modificou?
e quais as modificações
Como seria isto sem multithread?
Enviado: 28 Fev 2017 00:46
por JoséQuintas
Se quiser usar diferente do uso oficial, usei estes BATs, que já comentei por aqui
https://github.com/JoseQuintas/AllGui/tree/master/bat
Valem pra oficial também.
Só lembrando:
Qualquer compilação com Harbour é indicar pastas dos #include (arquivos ch e arquivos h) e pastas de lib.
Fiz algo como isto, em cada pasta: hbmk2 *.prg *.c *.rc -onomelib -hblib
E no uso, indicar a lista dessas libs que foram geradas, e pastas CH.
mgconfig.bat é o que vai mexer, pra indicar aonde estão suas pastas.
mgcreate é o que cria as libs
mgcompile é o que usa pra compilar, e já acrescenta a lista de pastas
Em mgcompile, adiciona/retira o que é mais comum, pra ter menos adicionais na hora de compilar.
Aqui criei em uma pasta que está no path arquivos intermediários com mesmo nome chamando esses, assim não precisei path adicional.
Como seria isto sem multithread?
Enviado: 28 Fev 2017 00:49
por Claudio Soto
JoséQuintas escreveu:Como seria feita a mesma coisa sem usar multihread?
Quais as alterações necessárias nos fontes?
Nota: Compilei usando HMG Extended modificada
Jose, la teoria es lo siguiente.
La funcion main quedaria algo asi como:
Código: Selecionar todos
Public nCont := 0
for i := 1 to 5
HmgMain(i)
next
ACTIVATE WINDOW ALL
Mintras que la funcion:
Código: Selecionar todos
PROCEDURE HMGMain ( i )
local name := "MD_Form_"+hb_ntos(i)
SET NAVIGATION EXTENDED
SEt WINDOW MAIN OFF
SET DELETED ON
//OpenPhoneDB()
DEFINE WINDOW &name ;
AT 10, 10 ;
WIDTH 800 ;
HEIGHT 600 ;
TITLE "Phone book" ;
ICON "phone" ;
ON INIT ( opendbf(), RefreshWinPhone( _sort , name ) ) ;
ON RELEASE closedbf()
...
END WINDOW
CENTER WINDOW &name
// ACTIVATE WINDOW MD_Form_1
RETURN
Se agregan dos funciones nuevas
Código: Selecionar todos
function opendbf
nCont++
if nCont == 1
OpenPhoneDB()
endif
return
function closedbf
nCont--
if nCont == 0
CLOSE DATABASES
endif
return
Se debe cambiar todas las referencias en forma de pseudo oop por las funciones set/getproperty y domethod, ej.
Código: Selecionar todos
PROCEDURE RefreshWinPhone ( _x1, name ) // ademas se agrega como parametro el nombre de la ventana
...
// MD_Form_1.MD_Grid_1.DeleteAllItems()
DoMethod( name, "MD_Grid_1", "DeleteAllItems" )
...
Como seria isto sem multithread?
Enviado: 28 Fev 2017 00:56
por Claudio Soto
Jose, para que veas los inconvenientes que crea tener una MiniGui por theread, agregale un boton a cada ventana de manera que al presionar cualquiera de ellos todas las ventanas se minimizan.
En forma convencional esto se hace como:
Código: Selecionar todos
...
@ 0, 0 BUTTON minwin CAPTION "min all" ACTION minall() // colocar esto dentro del Define Windows en la función HMGMain
...
function minall
for k := 1 to len ( _HMG_SYSDATA [ 67 ] )
minimize( _HMG_SYSDATA [ 67 ] [k] )
next
return
Si cambiaste _HMG_SYSDATA de publica a THREAD STATIC o haces que los thread no hereden las variables publicas, cuando clicas en el boton "min all" se va a minimizar solo la venta de ese thread y no todas como deberia.
Como seria isto sem multithread?
Enviado: 28 Fev 2017 07:40
por JoséQuintas
Nesse caso não alterei pra STATIC, continua PUBLIC.
O funcionamento é independente.
O ZIP contém um EXE, pode confirmar a reação.
Como seria isto sem multithread?
Enviado: 01 Mar 2017 09:30
por JoséQuintas
Esqueci de dizer: o seu exemplo é equivalente em visual, mas não em resultado prático.
Uma janela interfere na outra, porque estão usando as mesmas áreas de DBF.
Talvez tenha que fazer com DBFs igual com formulário... usar nomes diferentes.
E aí que está... ficar inventando coisas que multithread já faz.
Como seria isto sem multithread?
Enviado: 01 Mar 2017 10:35
por Claudio Soto
Hay que usar el dbf como si fuese en red.
Como seria isto sem multithread?
Enviado: 01 Mar 2017 12:31
por JoséQuintas
Também, mas acho que não percebeu justamente o que considero vantagem.
Duas janelas HMG:
Alterou a posição do registro atual, pronto, alterou o registro atual da outra janela também.
Alterou o índice atual, pronto, alterou de todas as janelas.
Resta fixar numa única janela, ou criar vários ALIAS conforme a janela.
O que se multiplica se forem usadas sub-janelas.
Ao passo que usando multithread, isso fica simplificado, pode-se usar o próprio nome do arquivo, nem precisa inventar alias.
O DBF tem esse inconveniente, que não acontece em conexão MySQL, por exemplo.
Foi justamente por isso que comecei a usar multithread: abrem-se janelas à vontade, sem se preocupar com os DBFs.
Aliás.... falando nisso... não sei se o fechamento da HMG causaria problema aos arquivos/índices abertos em threads diferentes.
Como seria isto sem multithread?
Enviado: 01 Mar 2017 13:52
por Claudio Soto
Creo que no causaria ningun problema porque antes de salir HMG hace un DbCloseAll