Pessoal, mais um desafio, não abri novo tópico pois acredito q esteja concernente a este, abaixo segue codigo q tirei do xHarbour e modifiquei (desculpem as traducoes, não domino o ingles, foi mais pra dar uma clareada), para entendimento das Background Functions e Idle Functions, como ficaria isto no Harbour, tendo em vista q não tem algumas funções q são utilizadas abaixo, quais seriam as correlatas?
Para os colegas q utilizam o xHarbour, basta compilar marcando o uso de MT q roda certinho, da pra ter uma idéia lega do assunto através deste PRG
Código: Selecionar todos
***********************************************************
* bkgtest.prg
*
* $Id: bkgtest.prg,v 1.6 2008/01/27 23:14:43 fsgiudice Exp $
*
* This test demonstrates usage of BACKGROUND functions that are an extension of IDLE functions;
* this is a variant of idle functions that runs only on idle state (as inkey(0) does)
* Background functions run on every vm execution. PLEASE BE CAREFULLY using these functions.
* Inside background functions you have to think that them are executed on EVERY vm call.
* Look at idletest.prg too.
*
* (C) 2003 - Francesco Saverio Giudice <info@fsgiudice.com>
*
* Modificado por Fladimir para efeito de estudo em Dez/2009
*
#include "set.ch"
#include "inkey.ch"
PROCEDURE Main()
LOCAL nId1, nId2, nId3, nId4, nId5, nId6, nId7, n
LOCAL lActive := .T.
LOCAL nSpeed := 500
* Thread or BackGround Function
// HB_IdleAdd() = Adds a background task for being executed during idle states.
// Syntax = HB_IdleAdd( <bAction> ) --> nTaskHandle
// Adicionando fun‡äes q serÆo sempre executadas qdo o sistema estiver OCIOSO
nId1 := HB_IdleAdd( {|| idleFunc( 10, "On Idle - From Block")} ) // Passado como Bloco
nId2 := HB_IdleAdd( { @idleFunc(), 11, "On Idle - From Array"} ) // Passado como Array
* Thread or BackGround Function
// HB_BackGroundAdd() = Adds a new background task.
// Syntax = HB_BackGroundAdd( <bAction>, [<nMillisecs>], [<lActive>] ) --> nTaskHandle
nId3 := HB_BackgroundAdd( { @CheckFunc() } , 1000, .F. ) //This task is defined but not active
nId4 := HB_BackgroundAdd( { @TimerFunc() } , 1000 ) //Define a Tarefa e o Tempo
nId5 := HB_BackgroundAdd( { @Counter1Func()} ) //Define a Tarefa
nId6 := HB_BackgroundAdd( { @Counter2Func()}, nSpeed ) //Define a Tarefa e o Tempo
nId7 := HB_BackgroundAdd( { "Counter3Func" }, 100 ) //Define a Tarefa e o Tempo
HB_BackgroundAdd( { @Ticker() }, 100 ) // 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." )
* Thread or BackGround Function
// SecondsSleep() = Suspends thread execution for a number of seconds.
// Syntax = SecondsSleep( <nSeconds> ) --> NIL
SecondsSleep( 3 )
DispInfo( "Agora irei executar uma simples tarefa manualmente" )
SecondsSleep( 3 )
DispInfo( "Contador trabalhando" )
FOR n := 1 TO 10000
// HB_BackGroundRun() = Enforces execution of one or all background tasks.
// Syntax = HB_BackGroundRun( [<nTaskHandle>] ) --> NIL
HB_BackgroundRun( nId5 ) // Executa a Fun‡Æo
NEXT
@3,5 SAY "Nas Linhas 10 e 11, 2 diferentes fun‡äes ociosas aparecerÆo piscando."
DispInfo( "Agora vc ver fun‡äes 1 ociosas executando at‚ vc pressionar uma tecla" )
inkey(0)
DispInfo( "Agora for‡ando manualmente todas background functions executarem" )
SecondsSleep( 3 )
DispInfo( "Background functions rodando manualmente" )
FOR n := 1 TO 100000
// Estava HB_BackGroundRunForced() mas nÆo achei nada a respeito
HB_BackgroundRun() // Rodando todas background tasks as q sejam SET BACKGROUND TASKS is ON
// as OFF nÆo rodam
IF n % 1000 == 0
IF Inkey() == K_ESC
EXIT
ENDIF
ENDIF
NEXT
DispInfo( "Agora vc ver funcoes 2 ociosas trabalharem ateh vc pressionar alguma tecla" )
inkey(0)
DispInfo( "Agora defini como ON as Tarefas de Background" )
SecondsSleep( 3 ) // depois de 3 segundos
SET BACKGROUND TASKS ON // Ligando as Tarefas de Background q nÆo estejam definidas como OFF
@5,5 SAY "Background Functions: Show Timer, Ticker, Counters and Check Time Elapsed."
@6,5 SAY "Depois de 10 segundos este programa ser for‡ado a sair."
DispInfo( "Programa Rodando junto com BackGround Tasks Ativas" )
// Now i make check time on
// Agora irei ativar a Tarefa nId3, q at‚ o presente momento esteve desativada setando como .T.
HB_BackgroundActive( nId3, .T. )
@ 11, 42 say " E a direita as Funcoes"
@ 12, 42 say " de BackGround tamb‚m "
@ 13, 42 SAY " de diferentes formas "
@ 15, 02 say " Veja o Programa Principal "
@ 16, 02 SAY " trabalhando abaixo "
@ 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 % 20000 == 0
lActive := !lActive
// // HB_BackGroundActive( <nTaskHandle> [, <lNewActive>] ) --> lOldActive
HB_BackgroundActive( nId7, lActive ) // Ativa ou Desativa nId7
@ 19, 55 SAY "Contador 03 " + IIF( lActive, "ON ", "OFF" )
ENDIF
IF n % 60000 == 0
IF nSpeed == 500
nSpeed := 0
ELSE
nSpeed := 500
ENDIF
// 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
IF n == 130000 // Se n = 130000
HB_BackgroundDel( nId5 ) // remove a Tarefa 5 do BackGround
@ 16, 55 SAY "Contador 01: DELETED " // mostra a palavra Deletada
ENDIF
ENDDO
// Estava comentado no original
/*
SET COLOR TO w/n
CLEAR SCREEN
@0,0 SAY "Removing " + ValToPrg( HB_IdleDel( nId1 ) )
@1,0 SAY "Removing " + ValToPrg( HB_IdleDel( nId2 ) )
@2,0 SAY "Done"
@4,0
SET CURSOR ON
*/
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
* Primeira Tarefa
PROCEDURE IdleFunc( nRow, cStr )
LOCAL nOldRow := Row()
LOCAL nOldCol := Col()
@nRow, 10 SAY cStr
ThreadSleep( 100 )
@nRow, 10 SAY Space(69)
SetPos( nOldRow, nOldCol )
RETURN
* Fun‡Æo de controle do tempo decorrido do final do exemplo
PROCEDURE CheckFunc()
STATIC nSeconds
STATIC nElapsed
LOCAL nOldRow := Row()
LOCAL nOldCol := Col()
IF nSeconds == NIL
nSeconds := Seconds()
ENDIF
nElapsed := Int( Seconds() - nSeconds )
@ 19, 10 SAY "Segundos Decorridos: " + Str( nElapsed )
IF nElapsed > 40
DispInfo( "Tempo esgotado! Saindo. Pressione alguma tecla para sair (note idle running meanwhile)" )
Inkey(0)
QUIT
ENDIF
SetPos( nOldRow, nOldCol )
RETURN
* Fun‡Æo q mostra a Hora
PROCEDURE TimerFunc()
LOCAL nOldRow := Row()
LOCAL nOldCol := Col()
@ 15, 55 SAY "Time: " + Time()
SetPos( nOldRow, nOldCol )
RETURN
* Fun‡Æo de Contagem 1
PROCEDURE Counter1Func()
STATIC nCount
LOCAL nOldRow := Row()
LOCAL nOldCol := Col()
IF nCount == NIL
nCount := 0
ENDIF
@ 16, 55 SAY "Contador 01: " + Str( nCount )
nCount++
SetPos( nOldRow, nOldCol )
RETURN
* Fun‡Æo de Contagem 2
PROCEDURE Counter2Func()
STATIC nCount
LOCAL nOldRow := Row()
LOCAL nOldCol := Col()
IF nCount == NIL
nCount := 0
ENDIF
@ 17, 55 SAY "Contador 02: " + Str( nCount )
nCount++
SetPos( nOldRow, nOldCol )
RETURN
* Fun‡Æo de Contagem 3
PROCEDURE Counter3Func()
STATIC nCount
LOCAL nOldRow := Row()
LOCAL nOldCol := Col()
IF nCount == NIL
nCount := 0
ENDIF
@ 18, 55 SAY "Contador 03: " + Str( nCount )
nCount++
SetPos( nOldRow, nOldCol )
RETURN
* Fun‡Æo para exibir a mensagem para observar os diversos tipos de contadores sendo executados
PROCEDURE Ticker()
STATIC nPos
STATIC cText
LOCAL cString
LOCAL nOldRow := Row()
LOCAL nOldCol := Col()
IF cText == NIL
cText := "Este ‚ o Texto da fun‡ao Ticker. ESC to exit. Veja as diferentes veloc. dos contadores "
nPos := 1
ENDIF
cString := Substr( cText, nPos ) + SubStr( cText, 1, nPos-1 )
@ 22, 0 SAY PadR( cString , MaxCol() )
nPos++
IF nPos > Len( cText )
nPos := 1
ENDIF
SetPos( nOldRow, nOldCol )
RETURN
Vlw... Sucesso!!!!
:)Pos