Simplificar com INLINE ou algo parecido

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

Simplificar com INLINE ou algo parecido

Mensagem por JoséQuintas »

Gostaria de simplificar isto. Pensei no INLINE mas todos que vi apenas definem valor sem retornar nada.

Código: Selecionar todos

THREAD STATIC SistemaForms := {}
THREAD STATIC SistemaLucroDebito  := {}
THREAD STATIC SistemaLucroCredito := {}
STATIC SistemacnMySql
STATIC SistemaEmpresaNome        := ""
STATIC SistemaEmpresaApelido     := ""
STATIC SistemalIsMultiThread     := .F.
STATIC SistemalIsWindowsMenu     := .F.
STATIC SistemalIsPlayText        := .F.
STATIC SistemaUserName           := "JPA"
STATIC SistemaUserLevel          := 2
STATIC SistemaUserPassword       := ""
STATIC SistemaVersaoEXE          := ""
STATIC SistemaVersaoDBF          := 0
STATIC SistemaVersaoDbfAnt       := 0
STATIC SistemaFormatoImpressao   := 1
STATIC SistemaTimeExe            := ""

CREATE CLASS SISTEMA
   METHOD cnMySql                       SETGET
   METHOD EmpresaNome( xValue )         SETGET
   METHOD EmpresaApelido( xValue )      SETGET
   METHOD EmpresaCodigo( xValue )       SETGET
   METHOD lIsMultiThread( xValue )      SETGET
   METHOD lIsWindowsMenu( xValue )      SETGET
   METHOD lIsPlayText( xValue )         SETGET
   METHOD UserName( xValue )            SETGET
   METHOD UserLevel( xValue )           SETGET
   METHOD UserPassword( xValue )        SETGET
   METHOD VersaoExe( xValue )           SETGET
   METHOD VersaoDbf( xValue )           SETGET
   METHOD VersaoDbfAnt( xValue )        SETGET
   METHOD FormatoImpressao( xValue )    SETGET
   METHOD TimeExe( xValue )             SETGET
   METHOD oForms( xValue )              SETGET
   METHOD anLucroDebito( xValue )       SETGET
   METHOD anLucroCredito( xValue )      SETGET
   METHOD Inicializa()
   METHOD GuiHide()
   METHOD GuiShow()
   END CLASS

   METHOD cnMySql( xValue )             CLASS cnMySql
      IF xValue != NIL
         SistemacnMySql := xValue
      ENDIF
      RETURN SistemacnmySql
      
   METHOD EmpresaNome( xValue )         CLASS SISTEMA
      IF xValue != NIL
         SistemaEmpresaCodigo := xValue
      ENDIF
      RETURN SistemaEmpresaCodigo
      
   METHOD EmpresaApelido( xValue )      CLASS SISTEMA
      IF xValue != NIL
         SistemaEmpresaApelido := xValue
      ENDIF
      RETURN SistemaEmpresaApelido
      
   METHOD EmpresaCodigo( xValue )       CLASS SISTEMA
      IF xValue != NIL
         SistemaEmpresaCodigo := xValue
      ENDIF
      RETURN SistemaEmpresaCodigo
Alguma idéia?
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
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Simplificar com INLINE ou algo parecido

Mensagem por JoséQuintas »

Só comentário:
Até agora usava Public Sistema := SistemaClass():New()

Mas com multithread isso tá complicando.
Então estou criando uma classe que usa variáveis static.
Só que não é mais Sistema como no post anterior. Acabei adotando App().

App():cnMySql vai retornar a conexão MySql do aplicativo, não importa a thread.
O mesmo para as outras variáveis/métodos.
Isso dispensa declarar variáveis em cada módulo, apesar de sacrificar a checagem /w3 /es2.
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/
sambomb
Usuário Nível 3
Usuário Nível 3
Mensagens: 250
Registrado em: 24 Out 2008 17:02
Localização: Itaocara - RJ - Brasil

Simplificar com INLINE ou algo parecido

Mensagem por sambomb »

METHOD Teste( SeuParametro ) INLINE If( SeuParametro, 1, 2 )
Imagem

Rca Sistemas - Itaocara - RJ
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Simplificar com INLINE ou algo parecido

Mensagem por JoséQuintas »

Infelizmente o sistema começou a dar "crash" ao ser encerrado.
E como tinha alterado os fontes antes destas alterações e sem backup intermediário, tive muito trabalho pra desfazer as alterações.
Com o "crash", significa que não dá pra usar isso.

Mas voltando ao INLINE, ele permite colocar código direto na declaração, mas não tem opção de retornar valor.
Achei algo nos fontes do Harbour:

Código: Selecionar todos

   ACCESS selected                              INLINE ::sl_lbClick
   ASSIGN selected( bBlock )                    INLINE ::sl_lbClick := bBlock

Código: Selecionar todos

   ACCESS cDesc                                   INLINE iif( ::cText == nil, "", ::cText )
   ASSIGN cDesc( cText )                          INLINE ::cText := cText
Mas vou ter que achar outra alternativa, o "crash" simplesmente não mostrava aonde deu erro.
O curioso é que podia abrir infinitas threads e fechar, e ia normal. Só dava o "crash" ao encerrar tudo.
E mais curioso ainda, é que se eu acessasse o help on line do sistema, aí não dava crash ao sair.

Tive que desfazer tudo

Nota: O help online usa MySql, o que faz a variável da conexão MySql ser a suspeita número 1
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
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Simplificar com INLINE ou algo parecido

Mensagem por JoséQuintas »

O crash foi com a variável do MySql, da conexão ADO.
Pelo trabalho que ia dar, acabei usando o jeito tradicional, só funções com o prefixo App de aplicativo.
De vantagem, a checagem de nomes errados pode ser feita na compilação.
Nota:
THREAD STATIC são variáveis STATIC, mas que cada thread tem a sua
Por exemplo, AppForms usa THREAD STATIC porque cada thread vai ter gráficos/formulários só seus, e AppUserName/AppUserLevel usam STATIC porque todas as threads abertas vão ser vinculadas ao mesmo usuário.

Código: Selecionar todos

FUNCTION AppForms()
   THREAD STATIC AppForms := {}
   RETURN AppForms
   
FUNCTION AppUserName( xValue )
   STATIC AppUserName := "JPA"
   IF xValue != NIL
      AppUserName := Trim( xValue )
   ENDIF
   RETURN AppUserName

FUNCTION AppUserLevel( xValue )
   STATIC AppUserLevel := 2
   IF xValue != NIL
      AppUserLevel := xValue
   ENDIF
   RETURN AppUserLevel
Obs. Multithread não é tão simples como parecia, mesmo usando
hb_ThreadStart( HB_BITOR( HB_THREAD_INHERIT_PUBLIC, HB_THREAD_MEMVARS_COPY ), @x() )
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