Newsgroup: it.comp.lang.delphi
Titolo: "Velocizzare" il TeeChart...

Salve...
io ho il seguente problema.
Devo campionare (in modo abbastanza veloce, diciamo 1 volta ogni 10
millisecondi) un segnale da una scheda hardware.
I dati acquisiti (migliaia di campionamenti) devono essere mostrati in real
time su di un TeeChart.
Io procederei in questo modo:
  repeat
   Application.ProcessMessages;
   a := Campiona;
   Chart1.Series[0].Add(a);
  until UserPressaButton;
Il problema č che siccome devo fare un campionamento ogni 10 millisecondi
(in modo abbastanza preciso) non posso permettermi ritardi... e purtroppo la
procedura Add del Chart occupa da sola il mio "slot" di 10 millisecondi.
A me andrebbe anche bene memorizzare temporaneamente 100 dati (quindi 1
secondo di campionamento) in un array e poi trasferirli "di colpo" nel Chart
(sperando che sia + veloce)... ma ho trovato solo il metodo "add" (o simili)
che mi permette solamente l'inserimento di un dato alla volta... mi andrebbe
anche bene bloccare il chart per 1 secondo, mostrare i dati campionati,
ribloccare il chart per un altro secondo e cosě via... ma non so se č
possibile.
Qualche suggerimento?
Ciao e grazie,
   Luca

Ci sono dei componenti specifici per la rappresentazione grafica di segnali,
dai un'occhiata su Torry. Il Teechart non credo sia molto adatto, si porta
dietro un "engine" piuttosto complesso e pesante che ovviamente, come anche
tu hai riscontrato, difficilmente riesce a stare dietro a 100 nuovi dati al
secondo.
Ciao, Sandro


No, non mi puoi dire cosģ...  :''(    che fitta al cuore!!!
Oramai ho disegnato tutta l'interfaccia grafica... ho passato una giornata
intera a giocare con la miriade di proprietą del TeeChart... inoltre ho gią
provato altri chart scaricati da DSP e non ce né uno configurabile come
TeeChart (con panning, zoom, etc.)... TeeChart per me č perfetto... devo
solo trovare un modo per velocizzarlo... deve esistere un modo... vuoi che
non abbiano inventato un metodo tipo "blocca grafica" o simile?
Ciao,
   Luca

il metodo FillSampleValues riesce a riempirmi il chart con 100000 valori a
caso in meno di 1 secondo... a me ne servono "solo" 1000 in un secondo... se
lo hanno fatto loro deve essere possibile farlo pure a me... o no? La
visualizzazione dei dati si ha solo una volta che ha finito (ossia dopo
circa un secondo) quindi deve essere possibile bloccare il chart... in
qualche modo... purtroppo io non ho il file PAS chiamato TEENGINE.PAS in cui
č contenuta la definizione di tale metodo... c'č qualcuno che ce l'ha?
Ciao,
   Luca

 che mi permette solamente l'inserimento di un dato alla volta...
Dunque, vediamo se è il TChart. Prova questo:
(Se la priorità Realtime non fosse definita dichiarala come $00000100)
function StartThread( par: Pointer ): dWord; stdcall;
begin
   repeat
    a := Campiona;
    Chart1.Series[0].Add(a);
   until UserPressaButton;
end;
procedure TForm1.Button1Click(Sender: TObject);
var tid: dWord;
begin
  hThread := CreateThread(nil,0,@StartThread,nil,CREATE_SUSPENDED,tid);
  SetThreadPriority(hThread, REALTIME_PRIORITY_CLASS)
  ResumeThread(hThread)
end;
Ciao! :-)
--
- Carlo -
cbertu81(at)libero(dot)it

Aggiungo a quanto già detto che forse è possibile (non lavoro molto con il
TeeChart) migliorare notevolmente le prestazioni utilizzando la
LockWindowUpdate() e richiamandola solo dopo aver aggiunto tot punti sul
disegno!


Avevi ragione... adesso faccio un "processmessages" ogni 100 iterazioni e va
mooolto piů svelto.
Ciao,
   Luca

 mooolto più svelto.
mi fa piacere, tuttavia ti consiglio di decentrare il codice nel thread
secondario fondamentalmente perchè utilizzando ProcessMessages rendi il tuo
thread "dipendende" dalla message queue!
Prova a fare questo esperimento: durante il campionamento inizia a muovere
la finestra (premento il mouse sulla barra e spostandoti) e noterai che il
campionamento dei dati non procede. Questo è solo uno degli esempi
possibili. Invece un thread separato (che non ha coda da servire, e quindi
può dedicare più tempo alla vera esecuzione del suo codice) con priorità
maggiore ti garantisce l'indipendenza completa da quel che sta avvenendo sul
tuo TForm. Combinando il codice con LockWindowUpdate(), inoltre, dovresti
assicurarti risultati altamente performanti!
Buon Lavoro
