Página 1 de 1

Atualizações HWGUI 31/10/2021

Enviado: 31 Out 2021 04:57
por JoséQuintas
Small change for multithread only activated if use -DMT_EXPERIMENTAL
No change if do not compile using this parameter

Se compilar a HWGUI do jeito normal, continua tudo como antes, nada alterado.

Se compilar com -DMT_EXPERIMENTAL, é como existir uma HWGUI pra cada thread.

Divirtam-se testando as possibilidades.

Atualizações HWGUI 31/10/2021

Enviado: 31 Out 2021 05:02
por JoséQuintas
hwgui.png
Apenas exemplo.
Janelas ilimitadas gtwvg e dialogs hwgui modal rodando ao mesmo tempo.
Cada uma em uma thread.

Atualizações HWGUI 31/10/2021

Enviado: 31 Out 2021 05:25
por JoséQuintas


Só pra curiosidade:
No browse é filtrando conforme digita, e são todas as cidades do Brasil.
MySQL + ADO

Atualizações HWGUI 31/10/2021

Enviado: 31 Out 2021 09:51
por JoséQuintas
Se compilar com -DMT_EXPERIMENTAL, é como existir uma HWGUI pra cada thread.
Não expliquei direito:
Se GERAR a hwgui com esse parâmetro, a hwgui é gerada diferente.

Depois é só usar normal.

Na geração da hwgui: hbmk2 hwgui.hbp -DMT_EXPERIMENTAL

Atualizações HWGUI 31/10/2021

Enviado: 01 Nov 2021 10:43
por JoséQuintas
Importante avisar, muita atenção no uso:

Em uma nova thread, a primeira dialog obrigatoriamente tem que ser MODAL.
Ela precisa bloquear o andamento da thread logo de início.

Se criar a primeira dialog como NOMODAL, a falta do bloqueio vai fazer a janela sumir, e virar zumbi.
Nesse caso, só fechamento no gerenciador de tarefas.

Faltou meu teste com GUI, mas se for o caso, acrescente isto no fonte da janela multithread:

Código: Selecionar todos

hb_gtReload( HB_GTI_VERSION )
Isso acrescenta uma janela invisível da gt gui default do Harbour.
Se a DIALOG precisa bloquear alguma coisa, vai bloquear isso invisível.

Atualizações HWGUI 31/10/2021

Enviado: 01 Nov 2021 10:54
por JoséQuintas
test.zip
(553.72 KiB) Baixado 148 vezes
Aqui minha compilação sempre empurra gtwvg, seja qual for o teste.

O exemplo do Itamar, agora abre janelas ilimitadas.
Só ficar clicando e vai abrindo janelas, cada uma em uma thread diferente.

Atualizações HWGUI 31/10/2021

Enviado: 01 Nov 2021 10:56
por JoséQuintas
mt.png
Favor fazer o teste compilando no ambiente de vocês pra ver qual o comportamento em Windows e Linux.

Atualizações HWGUI 31/10/2021

Enviado: 01 Nov 2021 11:03
por JoséQuintas
Nota:
Compilei sem manifest e sem assinatura.
É de se imaginar que vai ter o alerta do antivírus, como acontece com qualquer coisa baixada da internet sem isso.

Atualizações HWGUI 31/10/2021

Enviado: 01 Nov 2021 11:28
por JoséQuintas
Itamar
teste direito isso.
Se tudo ok, poderemos ter testes mais interessantes, dispensando de toda hora ficar criando um menu só pro teste funcionar.

Importante:

Em multithread, no default, uma thread não enxerga nada da outra.
É necessário reconfigurar RDD, SET DATE, e outras coisas mais, em cada thread.

O lado bom, é poder abrir os mesmos arquivos sem se preocupar se já estão abertos, qual índice, qual posição, etc.
O lado ruim é se precisar de uma informação da outra thread, mas sempre tem jeito pra tudo.

Atualizações HWGUI 31/10/2021

Enviado: 01 Nov 2021 11:43
por Itamar M. Lins Jr.
Olá!
Fiz teste no windows.
Precisa colocar hbmk2 -mt para funcionar, além de compilar a hwgui.hbp com -DMT_EXPERIMENTAL


Saudações,
Itamar M. Lins Jr.

Atualizações HWGUI 31/10/2021

Enviado: 01 Nov 2021 12:27
por JoséQuintas
Itamar M. Lins Jr. escreveu:Fiz teste no windows.
Precisa colocar hbmk2 -mt para funcionar, além de compilar a hwgui.hbp com -DMT_EXPERIMENTAL
Ok, pra funcionar multithread precisa multithread, normal.

A obrigatoriedade de -DMT_EXPERIMENTAL na hwgui, é pra evitar algum imprevisto em quem usa hwgui hoje.
Se tudo funcionar perfeito com hwgui compilada assim, é só liberar geral.

A única diferença é a forma de criar os arrays.
Sai o CLASSVAR, e entram os métodos.

Código: Selecionar todos

#ifdef MT_EXPERIMENTAL
   METHOD aDialogs          INLINE aDialogs()
   METHOD aModalDialogs     INLINE aModalDialogs()
#else
   CLASS VAR aDialogs       SHARED INIT {}
   CLASS VAR aModalDialogs  SHARED INIT {}
#endif
E entra um uso... que não sei se chamamos de normal, ou gambiarra:

Código: Selecionar todos

#ifdef MT_EXPERIMENTAL
   THREAD STATIC aDialogs := {}
   THREAD STATIC aModalDialogs := {}

   FUNCTION aDialogs()

      RETURN aDialogs

   FUNCTION aModalDialogs()

      RETURN aModalDialogs
#endif
A declaração THREAD STATIC torna a variável STATIC, com conteúdo visível em todo aplicativo, mas a declaração THREAD significa uma pra cada thread.
O uso diferente está na função, que equivale exatamente à variável.

Código: Selecionar todos

AAdd( aModalDialogs(), x )
hb_Adel( aModalDialogs(), x )
No exemplo acima é sem ser método, só pra ficar claro o uso fora do normal.
Variável STATIC é visível apenas no fonte onde foi criada.
Como a função fica no mesmo fonte da variável, ela enxerga a variável, e todo aplicativo enxerga a variável através da função.
No caso da HWGUI é exatamente isso, mas a variável continua sendo o método das classes.

Em resumo da minha alteração: apenas troquei o que era visível geral, por uma coisa que é visível por thread.
É como se fosse trocar uma variável PUBLIC por uma PRIVATE.

Se trabalhar sem multithread, como sempre foi, vai ser só uma variável, como sempre foi.
Se trabalhar com várias threads, que seria a novidade, automaticamente cada thread vai criar a sua variável.

Teoricamente não faz diferença pra hwgui em geral, mas nunca se sabe se pode aparecer algum imprevisto.

No uso prático, significa que em multithread teremos uma hwgui pra cada thread, uma não atrapalhando a outra.

Multithread é como vários EXEs separados.
Ao usar uma janela MODAL, um EXE não pode bloquear o outro.
E é exatamente isso que acontece com essa mudança, porque cada um tem sua própria lista de janelas.

Nada do outro mundo, apenas listas diferentes.

E é isso que permite misturar tudo que é GUI num EXE só, porque em cada thread usa o que quiser, pode até misturar a LIB com ela mesma.