Página 1 de 1

Tasks do xHB no Harbour

Enviado: 22 Abr 2011 12:45
por fladimir
Olá nobres colegas estou batendo cabeça com o código abaixo q no xHarbour funciona bem, preciso fazer funcionar no Harbour pois tenho uma rotina q preciso desenvolver em cima da idéia deste exemplo do xHarbour, mas já começa com o problema do SET BackGround Tasks On q não funciona no Harbour, o comando correlato seria HB_BackgroundRun() mas não dá certo. Nem com o HB_BackGroundRunForced()

Segue código:

Código: Selecionar todos

#include "set.ch"
#include "inkey.ch"

PROCEDURE Main()
   LOCAL nId1, nId2, nId3, nId4, nId5, nId6, nId7, n 
   LOCAL lActive := .F.
   LOCAL nSpeed  := 500

   nId6 := HB_BackgroundAdd( { @Fecha_Auto(), 10 }, 15000   )  //Define a Tarefa e o Tempo

   SET COLOR TO w+/B
   CLEAR SCREEN
   SET CURSOR OFF
   @1,0 SAY Padc( "X H A R B O U R - Background and Idle Function Test.", MaxCol() )

   DispInfo( "Tarefas Background definidas, mas nÆo rodando." )
	SecondsSleep( 3 )
   HB_BackgroundRun() // Rodando todas background tasks as q sejam SET BACKGROUND TASKS is ON
   SecondsSleep( 3 )  // depois de 3 segundos

   SET_ BACKGROUND TASKS ON  // Ligando as Tarefas de Background q nÆo estejam definidas como OFF no xHarbour

   @ 18, 02 SAY "Contador do Programa Principal: "
   n := 0
   DO WHILE .T.
       @ 18, 32 SAY ++n
       
		 IF n % 1000 == 0
          IF Inkey() == K_ESC
             EXIT 
          ENDIF
       ENDIF
//     HB_BackgroundActive( nId7, lActive ) // Ativa ou Desativa nId7
//     HB_BackgroundDel( nId5 )                   // remove a Tarefa 5 do BackGround

       IF n % 60000 == 0
	 // Muda o Tempo da nId6, ou seja, passa o parametro nSpeed (Tempo) para a Fun‡Æo q esta rodando em BackGround
          //HB_BackgroundTime( nId6, nSpeed )
          //@ 20, 55 SAY "Contador 02 Tempo = " + Str( nSpeed, 3 )
       ENDIF
   ENDDO
RETURN

*Fun‡Æo para mostrar mensagem
PROCEDURE DispInfo( cMsg )
  LOCAL nOldRow := Row()
  LOCAL nOldCol := Col()
  IF cMsg == NIL
     cMsg := ""
  ENDIF
  @ 23, 0 SAY PadC( cMsg, MaxCol() )
  SetPos( nOldRow, nOldCol )
RETURN


*****************************
Function Fecha_Auto(vAguarda)  // vem por parametro a quantidade de segundos até fechar
*****************************
If File("fecha.txt")  // se achar o arquivo que é gerado assim que começa a baixar o FTP...
   Mensag("O Sistema vai Fechar nessa estação em: " +str(vAguarda)+ " Segundos...")  // mensagem na tela
   for nI:=1 to vAguarda // quantidade de segundos a aguardar
      MilliSec( 1000 )  // aguarda um segundo
      Mensag("O Sistema vai Fechar nessa estação em: "+ STR(vAguarda-nI) +" Segundos...")  // muda mensagem na tela
   next

   //Fim_Run()  // finaliza a mensagem na tela
   __Quit()
   x:=.f.
   return x
endif
//ThreadSleep( 15000 )
Return


Function MilliSec(Arg1)
Arg1:= Arg1 / 1000
Inkey(Arg1)
return

********************************
function MENSAG(Arg1, Arg2, Arg3)
   local Local1, Local2
   Local1:= SaveScreen(24, 0, 24, 80)
   Local2:= Set(_SET_DEVICE)
   set device to screen
   if (PCount() == 0)
      limpa()
      RestScreen(24, 0, 24, 80, Local1)
      return .T.
   endif
   if (!(right(Arg1, 1) $ "?!.ÿ"))
      Arg1:= Arg1 + "."
   endif
   if (Arg2 = Nil)
      @ 23,  0 say padc(Arg1, 80) color "R*/W"
   else
      @ 23,  0 say padc(Arg1, 80) color Arg2
   endif
   inkey(0.4)
  
   Set(_SET_DEVICE, Local2)
   RestScreen(24, 0, 24, 80, Local1)
Return .T.
Esse código faz parte de um do Vagucs q exemplifica várias tarefas rodando em paralelo a aplicação principal, eu resumi ele e deixei somente 1 tarefa q seria a de fechar a aplicação caso verificasse a presença do arquivo FECHA.TXT, tenho este PRG rodando compilado com o xHarbour.

Já tentei por o #include 'hbcompat.ch' e compilar mas da erro não encontra o SET BACKGROUND TASKS

Alguém sabe como obter o mesmo resultando no Harbour?


Sucesso!!!

:)Pos

Re: Tasks do xHB no Harbour

Enviado: 04 Mai 2011 01:27
por fladimir
Por Favor nobres colegas alguém que tenha isso funcionando de o caminho das pedras....

Preciso resolver isto para poder colocar meu sistema para atualizar online, rodar funções em Background sem afetar o mesmo.

grato e Sucesso!!!

:{

Re: Tasks do xHB no Harbour

Enviado: 04 Mai 2011 19:07
por asimoes
Fladimir,

Teste este código. Talvez ajude.

Para compilar:

set hb_compiler=mingw ou bcc
hbmk2 task.hbp

task.hbp:

Código: Selecionar todos

#---------------------------
# Nome do Executável
# ---------------------------
-otask
# ---------------------------
# Bibliotecas
# ---------------------------
-lhwgui
-lprocmisc
-lhbct
-lhbgt
-lgtwvg
-lgtwvt
-lhbwin
-lhbnf
-lhbtip
-lxhb
-lhbnetio
# ---------------------------
# Caminhos dos Includes
# ---------------------------
#-incpath=d:\hb21\include;d:\harbourx\hwgui\include
-incpath=d:\harbourx\hwgui\include
# ---------------------------
# Caminho das Libs da HwGui
# ---------------------------
#-Ld:\hb21\lib\win\mingw
#-Ld:\harbourx\mingw\lib
-Ld:\harbourx\hwgui\lib
# ---------------------------
# Outros Parâmetros
# ---------------------------
-workdir=.\OBJ\
-gtgui
-head=full
-n
-nowarn
-inc
#-icon=.\img\asaprev.ico
-mt
-b
# ---------------------------
# Prg(s) e Rc(s)
# ---------------------------
TASK
TASK.PRG:

Código: Selecionar todos

#include "std.ch"
#include "set.ch"
#include "inkey.ch"
#include "setcurs.ch"
#include "error.ch"
#include "achoice.ch"
#include "fileio.ch"
#include "common.ch"
#include "dbinfo.ch"
#include "hbver.ch"
#include "wvtwin.ch"
#include "hbgtinfo.ch"
#include "hbgtwvg.ch"
#include "wvgparts.ch"
#include "hbcompat.ch"
#include "windows.ch"

FUNCTION Main()

   hb_threadStart( @ShowDateTime() )
  
   SET COLOR TO w+/B
   CLEAR SCREEN
   SET CURSOR OFF
   @1,0 SAY Padc( "H A R B O U R - Background and Idle Function Test.", MaxCol() )

   @ 18, 02 SAY "Contador do Programa Principal: "
   n := 0
   DO WHILE .T.
       @ 18, 32 SAY ++n
       IF n % 1000 == 0
          IF Inkey() == K_ESC
             EXIT 
          ENDIF
       ENDIF
       IF n % 60000 == 0
       ENDIF
   ENDDO
RETURN


*Fun‡Æo para mostrar mensagem

FUNCTION ShowDateTime()
   local cTime
   while .T.
      cTime := dtoc( date() ) + " " + time()
      hb_dispOutAt( 0, maxcol() - len( cTime ) + 1, cTime, "W+/B" )
      hb_idleSleep( 15 ) //AQUI DEFINE O TEMPO QUE ESTA FUNÇÃO IRÁ EXECUTAR PARA MOSTRAR A DATA E HORA ATUAIS, NESTE CASO A CADA 15 SEGUNDOS.
   enddo
return nil

INIT FUNCTION AppSetup()
  
  REQUEST HB_LANG_PT
  REQUEST HB_CODEPAGE_PT850
  HB_LANGSELECT("PT")
  HB_CDPSELECT( "PT850" )

  REQUEST HB_GT_GUI_DEFAULT
  REQUEST HB_GT_WVG
  REQUEST HB_GT_WVT
  REQUEST HB_GT_WGU

  SETMODE(25,80)
  SET TYPEAHEAD TO 0
  SET INTENSITY ON
  SET SCOREBOARD OFF
  SET DELETED ON
  SET SAFETY OFF
  SET DATE ANSI
  SET ESCAPE ON
  SET CENTURY ON
  SET DATE FORMAT "DD/MM/YYYY"
  SET DELIMITERS TO
  SET EXCLUSIVE OFF
  SET WRAP ON
  SET EPOCH TO 1920
  SET OPTIMIZE ON
  SET AUTOPEN ON
  SET DBFLOCKSCHEME TO DB_DBFLOCK_DEFAULT 
  
  IniciaJanela() 

RETURN Nil 

FUNCTION IniciaJanela(nLi,nCi,nLf,nCf)
LOCAL oCrt
PUBLIC hWnd,;
       cTituloJanela,;
       oDlgHabla,;
       oTimer,;
       cPrinter:=GetDefaultPrinter()       
      
DEFAULT nLi TO -4,;
        nCi TO -4,;
        nLf TO MaxRow(),;
        nCf TO MaxCol()

  oCrt := WvgCrt():New( , , { nLi,nCi }, { nLf,nCf}, , .T. )
  oCrt:lModal := .F.
  oCrt:icon := ''
  oCrt:create()
  oCrt:resizable :=.T.
//---------------------------------------------------------------------------------------------------------
    WVT_SetFont("Lucida Console",28,10) //28,10,0  FW_NORMAL, FW_BOLD, FW_BLACK
    cTituloJanela:=HB_OEMTOANSI("TESTE COM TASK")
    WVT_SetTitle(cTituloJanela)
    WVT_SetAltF4Close(.F. )
    HB_gtInfo( HB_GTI_SPEC, HB_GTS_WNDSTATE, HB_GTS_WS_MAXIMIZED )
    hWnd:=HWG_FindWindow( ,cTituloJanela)
RETURN Nil

Tasks do xHB no Harbour

Enviado: 08 Mai 2011 20:56
por fladimir
Obrigado colega ASimoes pela atençao dispensada, testei seu exemplo e não entendi, pois fika rodando o contador principal sem parar e ao pressionar ESC cai fora não deveria se comportar diferente?

Grato.

:{

Tasks do xHB no Harbour

Enviado: 08 Mai 2011 22:25
por asimoes
Olá Fladmir,

Veja que a rotina fica em loop até que se pressione a tecla Esc, a função ShowDateTime está em sendo executado em uma thread (hb_threadStart()) poderia ser até em um get que a data e hora são atualizadas a cada n segundos, esta função ShowDateTime poderia ser um controle para colocar o sistema em manutenção por exemplo.

[]´s

Tasks do xHB no Harbour

Enviado: 09 Mai 2011 00:28
por fladimir
Verdade mano, entendi com tua explicação a lógica da coisa... obrigado vou analisar melhor teu exemplo e como encaixar na questão do tópico, mas acredito q vá de encontro sim ao q preciso, depois posto o resultado.

Grato

Sucesso!!!

:{

Tasks do xHB no Harbour

Enviado: 09 Mai 2011 05:49
por asimoes
Fladmir,

Faz outro teste, retira o loop e coloca um get por exemplo:

Código: Selecionar todos

@10,00 SAY "ESPERANDO ALGUMA COISA" GET cVar
READ
Na função ShowDateTime você pode testar o tempo por exemplo se for >= 60 segundos, para fechar a aplicação.


[]´s

Tasks do xHB no Harbour

Enviado: 09 Mai 2011 09:24
por fladimir
Ok ASimoes, do GET pelo Loop blz troquei tranquilo, agora a do no ShowDateTime for maior q 60 fecha a aplicação seria tipo no idleSleep coloco 60 e depois um quit ou nada ver não entendi muito bem...

Grato


Sucesso!!!

:)Pos

Tasks do xHB no Harbour

Enviado: 09 Mai 2011 11:10
por asimoes
Fladimir,

Estou tentando criar um exemplo para teste, mas tem uns probleminhas com as funções de thread do harbour, assim que possível vou postar um exemplo.

[]´s

Tasks do xHB no Harbour

Enviado: 09 Mai 2011 12:37
por fladimir
Agradeço colega vai ajudar muito vou ficar t devendo um churras...

Grato

Sucesso!!!

:{

Tasks do xHB no Harbour

Enviado: 09 Mai 2011 13:17
por asimoes
Fladimir,

A idéia é por ai. Teste este código.

Neste código você vair ter que criar um dbf sistema.dbf
Com a estrutura:

Campo: EMMANUT
Tipo : LOGICAL
Tam : 1

Você pode evoluir neste código e depois postar aqui para apreciação.

[]´s

Código: Selecionar todos

#include "std.ch"
#include "set.ch"
#include "inkey.ch"
#include "setcurs.ch"
#include "error.ch"
#include "achoice.ch"
#include "fileio.ch"
#include "common.ch"
#include "dbinfo.ch"
#include "hbver.ch"
#include "wvtwin.ch"
#include "hbgtinfo.ch"
#include "hbgtwvg.ch"
#include "wvgparts.ch"
#include "hbcompat.ch"
#include "windows.ch"
#include "hbthread.ch"

FUNCTION Main()
   PRIVATE nStart
  
   SET COLOR TO w+/B
   CLEAR SCREEN
   SET CURSOR OFF
   @1,0 SAY Padc( "H A R B O U R - Background and Idle Function Test.", MaxCol() )

   REQUEST DBFCDX
   RDDSetDefault("DBFCDX")

   /*
   Structure for database: J:\HARBOUR\TASK\SISTEMA.DBF
   Field  Field Name  Type       Width    Dec
   1      EMMANUT     Logical        1                  
   */
   
   hb_threadStart(@ShowMensage())
   
   DO WHILE .T.
      cVar:=Space(5)
      @10,00 SAY "AGUARDANDO ALGUM EVENTO " GET cVar
      READ
      IF LASTKEY() = 27
         DbCloseAll() 
         EXIT
      ENDIF
   ENDDO
RETURN


*Fun‡Æo para mostrar mensagem

FUNCTION ShowMensage(cAlias)

STATIC cTime
LOCAL lManut:=.F.

   IF cTime = Nil
      DbUseArea(.T.,"DBFCDX","SISTEMA","SISTEMA")
      cTime:=Time()
   ENDIF
   
   WHILE .T.
      
      SISTEMA->(DbSkip(0)) //ATUALIZAR A AREA DE TRABALHO
      
      cElapTime:=TsTring(Secs(Time())-Secs(cTime))

      hb_dispOutAt( 1, maxcol() - len( cElapTime ) + 1, cElapTime, "W+/B" )

      IF Secs(Time())-Secs(cTime) = 10

         IF SISTEMA->EMMANUT
            lManut:=.T.
            EXIT
         ENDIF
         cTime:=Time()
      ENDIF
      HB_IdleSleep( 1 ) //AQUI DEFINE O TEMPO QUE ESTA FUNÇÃO IRÁ EXECUTAR
   ENDDO
   IF lManut
      MsgInfo("Sistema em manutenção")
      SISTEMA->(DbCloseArea())
      ExitProcess()
   ENDIF
RETURN NIL

INIT FUNCTION AppSetup()
  
  REQUEST HB_LANG_PT
  REQUEST HB_CODEPAGE_PT850
  HB_LANGSELECT("PT")
  HB_CDPSELECT( "PT850" )

  REQUEST HB_GT_GUI_DEFAULT
  REQUEST HB_GT_WVG
  REQUEST HB_GT_WVT
  REQUEST HB_GT_WGU

  SETMODE(25,80)
  SET TYPEAHEAD TO 0
  SET INTENSITY ON
  SET SCOREBOARD OFF
  SET DELETED ON
  SET SAFETY OFF
  SET DATE ANSI
  SET ESCAPE ON
  SET CENTURY ON
  SET DATE FORMAT "DD/MM/YYYY"
  SET DELIMITERS TO
  SET EXCLUSIVE OFF
  SET WRAP ON
  SET EPOCH TO 1920
  SET OPTIMIZE ON
  SET AUTOPEN ON
  //SET DBFLOCKSCHEME TO DB_DBFLOCK_DEFAULT 
  
  IniciaJanela() 

RETURN Nil 

FUNCTION IniciaJanela(nLi,nCi,nLf,nCf)
LOCAL oCrt
PUBLIC hWnd,;
       cTituloJanela,;
       oDlgHabla,;
       oTimer,;
       cPrinter:=GetDefaultPrinter()       
      
DEFAULT nLi TO -4,;
        nCi TO -4,;
        nLf TO MaxRow(),;
        nCf TO MaxCol()

  oCrt := WvgCrt():New( , , { nLi,nCi }, { nLf,nCf}, , .T. )
  oCrt:lModal := .F.
  oCrt:icon := ''
  oCrt:create()
  oCrt:resizable :=.T.
//---------------------------------------------------------------------------------------------------------
    WVT_SetFont("Lucida Console",28,10) //28,10,0  FW_NORMAL, FW_BOLD, FW_BLACK
    cTituloJanela:=HB_OEMTOANSI("TESTE COM TASK")
    WVT_SetTitle(cTituloJanela)
    WVT_SetAltF4Close(.F. )
    HB_gtInfo( HB_GTI_SPEC, HB_GTS_WNDSTATE, HB_GTS_WS_MAXIMIZED )
    hWnd:=HWG_FindWindow( ,cTituloJanela)
RETURN Nil