Newsgroup: it.comp.lang.vo-clipper
Titolo: VO CheckMessages

Devo far funzionare alla meglio un programma in VO con le seguenti
caratteristiche:
- deve girare in background
- deve consumare poca CPU
- deve funzionare sempre
- fa un polling su di un log file sul quale altri utenti in rete fanno
richieste (appendono un record contenente la richiesta)
In pratica il cuore del programma è questo
DO WHILE LeggiAncora
   SELECT manrp
   IF RichiestaNonEseguita
      // esegue la richiesta
   ENDIF 
   // funzione che dovrebbe ridurre la percentuale di utilizzo di CPU
secondo gli esempi riportati nella guida How to..
   CheckMessages()
   IF RECNO() < LASTREC()
      SKIP
   ENDIF	
ENDDO
In realtà quando eseguo il programma la CPU è sparata al 100%  e non si
abbassa mai.
Ho provato a compilare anche l'esempio completo riportato nella
documentazione How to.. ma è lo stesso 
La funzione RebuildFile non riesce a creare l'indice.
Qualcuno mi può illuminare in merito?
Considerazione: per ogni cosa che imparo e/o capisco sorgono 10 nuovi
problemi, e allora la domanda sorge spontanea:
"riuscirò mai a diventare produttivo come lo sono con Clipper?"
PROCEDURE CheckMessages()
LOCAL msg IS _WinMsg
DO WHILE ( PeekMessage( @msg, 0, 0, 0, PM_REMOVE ) )
TranslateMessage(@msg)
DispatchMessage(@msg)
ENDDO
RETURN
FUNCTION RebuildFile()
...
INDEX ON Name TAG Name	;
TO Customer				;
EVAL CheckMessages()	;
EVERY 100
...
RETURN


Una prima dritta è quella di dimenticarti i cicli "infiniti" in Windows,
è il motivo per cui la CPU ti spara sempre a cento. Crea una finestra
nascosta e se proprio vuoi eseguire un polling continuo potresti
utilizzare uno o più timer. Il timer fa sì che si generi un messaggio
ogni NN millisecondi che decidi tu e ti arriva nella Dispatch della
finestra; da lì fai tutte le operazioni che vuoi
Quindi devi fare:
1.Metodo START di VO (classico)
METHOD Start() CLASS App
LOCAL oWnd AS OBJECT
oWnd := MyWindow{ SELF }
SELF:Exec()
2. Finestra per POLLING
CLASS MyWindow INHERIT DataWindow
METHOD Init(oOwner, oSource, nResourceID) CLASS MyWindow
SUPER:Init(oOwner, oSource, nResourceID)
// 1 è l'identificatore del TIMER xxx è il tempo per il polling in
millisecondi
SetTimer( SELF:Handle(), 1, xxx, NULL )
RETURN SELF
METHOD Destroy() CLASS MyWindow
LOCAL uRet AS USUAL
// 1 è l'identificatore del TIMER deve essere uguale a quello nella INIT
KillTimer( SELF:Handle(), 1 )
uRet := SUPER:Destroy()
// Così termina anche l'applicazione principale
GetAppObject():Quit()
RETURN uRet
METHOD Dispatch( oEvent ) CLASS MyWindow
LOCAL uRet AS USUAL
IF oEvent:uMsg == WM_TIMER .AND. oEvent:wParam == 1
// Operazioni di POLLING su file
.........
..........
RETURN 0L
ENDIF
uRet := SUPER:Dispatch( oEvent )
RETURN uRet
Potresti utilizzare anche più TIMER, sono identificati tramite ID
che trovi in wParam... consulta la documentazione delle API
SetTimer, KillTimer e messaggio WM_TIMER per delucidazioni...
Per uscire devi richiamare il Metodo EndWindow che provvede
ad uscire anche dall'applicativo principale.
Un altro modo, sicuramente migliore ma molto più complesso
è quello di creare un Thread temporizzato figlio dell'applicativo;
Io li usavo in C++ in VO non ho ancora avuto l'occasione di provare...
Spero di esserti stato utile, ciao.


