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.
#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:
#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.
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.