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.