View Full Version : "Rallentare" un ciclo for
Salve a tutti
mi trovo a dover escogitare un modo per rallentare l'esecuzione di un ciclo for, la cui velocità dipende (credo) dalla velocità della macchina.
Sto programmando un'applicazione in Visual C++,che deve disegnare "real time" un grafico di una forma d'onda (in pratica tipo strip chart)
NN sto a spiegarvi xchè (sono niubbo :( ), devo disegnare un pixel alla volta di sta forma d'onda, e devo correlare la forma d'onda a un asse dei tempi....
Pensavo a installare un timer, e rendere indipendente dalla macchina la velocità di esecuzione del for.....
Esiste qualche metodo + sicuro? Idee?
Aiutatemi....
Sto programmando un'applicazione in Visual C++,che deve disegnare "real time" un grafico di una forma d'onda (in pratica tipo strip chart)
Stai lavorando con le MFC o solo con le API Win32??
Stai lavorando con le MFC o solo con le API Win32??
perdonami, ti rispondo in modo "grezzo" :fagiano:
ho creato un'applicazione "MFC Application wizard", dialog based...
cmq per ora sto lavorando cn le MFC, credo di nn aver avuto molto a che fare sinora cn le API.... :stordita:
Beh, in realtà tutte le funzioni che chiami sono funzioni membro delle MFC che a loro volta chiamano le api, quindi le stai usando indirettamente :)
Si, il timer è la soluzione giusta (perchè non dovrebbe essere sicura?), anche perchè non vedo come eseguire un loop e aggiornare il grafico contemporaneamente se non mettendo il loop in un thread.
Guarda SetTimer (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcmfc98/html/_mfc_cwnd.3a3a.settimer.asp) e WM_TIMER
in pratica, riflettendoci un pò, installando un timer ed eseguendo un loop tramite il suddetto, nn dovrei + aver bisogno del for..... o sbaglio?
potrei creare un ciclo veloce quanto voglio tramite un timer....
è fattibile secondo te (voi)?
Fenomeno85
20-01-2006, 13:39
sleep (time)
~§~ Sempre E Solo Lei ~§~
in pratica, riflettendoci un pò, installando un timer ed eseguendo un loop tramite il suddetto, nn dovrei + aver bisogno del for..... o sbaglio?
potrei creare un ciclo veloce quanto voglio tramite un timer....
è fattibile secondo te (voi)?
Si, esatto. Devi solo mantenere un index che aggiorni manualmente a ogni WM_TIMER, invece che farlo fare al loop
Esempio, questo ciclo...
for (int i = 0; i<qualcosa; i++)
{
doSomething(array[i]);
}
diventa...
void OnTimer(..)
{
doSomething(array[i]);
i++;
}
...senza aver problemi di hang della tua applicazione.
Chiaramente sia "array" che "i" devono essere o globali o membri della tua classe
grazie del consiglio....
nn potrei dichiarare la variabile i come static, e quindi locale?
@fenomeno
in pratica la funzione sleep provoca un ritardo.....
il problema è che io vorrei che la macchina dove lavoro fosse "+ lenta", o almeno veloce quanto voglio io....
in pratica devo rendermi indipendente dalla velocità della macchina, che poi è la causa che mi ha portato a valutare questa cosa....
Fenomeno85
20-01-2006, 14:21
ah ho capito ... scusa ma per quale problema hai dovuto fare questo?
~§~ Sempre E Solo Lei ~§~
ah ho capito ... scusa ma per quale problema hai dovuto fare questo?
~§~ Sempre E Solo Lei ~§~
in breve, in un vecchio programma, il "plottaggio" del grafico era fatto tramite un ciclo for che disegnava in pratica un pixel per volta.
Nella prima schermata veniva costruito l'asse dei tempi in base al clock della macchina, e cioè in base a quanto veloce si disegnava il grafico.
Cn macchine lente funzionava:ora invece, andando troppo veloce, si finisce la prima shermata in un tempo inferiore al secondo......
te l'ho fatta molto breve, ma + o - la cosa sta in qsti termini
raga, ritorno sulla questione perchè ho fatto alcune prove e altre considerazioni.
Se provo ad eseguire il ciclo for, durante quest'ultimo (e soprattutto se ripeto il ciclo for indefinitamente) nn posso + accedere ai comandi della finsestra (ovvio direte voi)
Stavo pensando di programmare in modo multithread, cioè fare un thread che si occupa del plot dei dati (ad alta priorità) e l'applicazione principale gestisce i comandi tipo: FREEZE, STOP, +/- AMPL, +/- LINEA DI ZERO ecc....
fattibile?
Ma come, non eri passato ai timer? Con il timer questo problema non c'è, dato che non blocca la gestione dei messaggi :confused:
Ma come, non eri passato ai timer? Con il timer questo problema non c'è, dato che non blocca la gestione dei messaggi :confused:
lo so, ma ti spiego perchè sto valutando sta soluzione
se uso un ciclo fatto con timer, anche se è molto veloce (ma nn so con sicurezza QUANTO veloce), posso perdere molti campioni del segnale, visto che io nn uso un buffer per plottare (lo so,nn ditemi nulla, è barbaro come modo....)
una cosa importante ho da chiederti: ma creare/gestire pià thread nella stessa apllicazione in visual c++, è possibile con le applicazioni dialog based?
Ti prego, dimmi di si..... :cry:
ma creare/gestire pià thread nella stessa apllicazione in visual c++, è possibile con le applicazioni dialog based?
Ti prego, dimmi di si..... :cry:
Sì, è tranquillamente possibile. :)
Sì, è tranquillamente possibile. :)
grazie :)
riguardo la questione dei timer, credo che cmq per me nn sia possibile usarli, perchè ho provato che, se per esempio ritardo ogni iterazione for di 1msec(il minimo, credo)m, è troppo lento! :cry:
riguardo la questione dei timer, credo che cmq per me nn sia possibile usarli, perchè ho provato che, se per esempio ritardo ogni iterazione for di 1msec(il minimo, credo)m, è troppo lento! :cry:
Se hai provato (come penso) la gestione dei timer tramite il messaggio WM_TIMER, sappi alcune cose:
- WM_TIMER viene dispacciato come messaggio, ed è oltretutto un messaggio a bassa priorità (cioè viene inviato solo quando non ci sono messaggi a priorità più elevata nella coda dei messaggi).
- Sebbene alla funzione SetTimer si possa passare un valore in millisecondi, non è detto che la risoluzione sia proprio del millisecondo. La documentazione dice ad esempio: "Windows 2000/XP: If uElapse is less than 10, the timeout is set to 10".
Quindi WM_TIMER è inaffidabile se devi gestire temporizzazione molto precise e dell'ordine del millisecondo.
Puoi provare eventualmente a vedere se ti possono essere utili i <Multimedia Timers> (http://msdn.microsoft.com/library/en-us/multimed/htm/_win32_multimedia_timers.asp).
allora..... :)
penso di aver risolto il problema abbassando la frequenza di campionamento della scheda DSP che mi fornisce il segnale, visto che prima avevo sovracampionato un pò troppo (10khz contro un segnale che varia con frequenza di2-3hz al max....). Ora ho scelto come frequenze possibili 800-400-200-100Hz
Ora sto studiando la questione del multithread....
in pratica, in una finestra di dialogo, voglio creare un thread che si occupa del plottaggio del segnale (ciclo for) e il thread principale si occupa dei comandi utente.
Sarà difficile secondo voi?
Sarà problematico passare dal thread principale al thread "di lavoro" i valori aggiornati delle variabili?
Fenomeno85
24-01-2006, 16:59
cioè te hai un segnale che va a f0= 2hz e mi campioni a 800hz? fai un sacco di campionamente inutile.
~§~ Sempre E Solo Lei ~§~
Fenomeno85
24-01-2006, 20:31
ah comunque se non ricordo male anche sotto vc++ ci dovrebbe essere il corrispondente timer del vb che è molto semplice.
~§~ Sempre E Solo Lei ~§~
cioè te hai un segnale che va a f0= 2hz e mi campioni a 800hz? fai un sacco di campionamente inutile.
~§~ Sempre E Solo Lei ~§~
si, in pratica faccio questo per nn perdere campioni importanti e per simulare in modo pezzotto un real-time....
ora sto studiando come creare un nuovo thread nell'applicazione, che si deve occupare di plottare il grafico.
Hai suggerimenti/guide da darmi?
GRAZIE A TUTTI!!!!
Fenomeno85
25-01-2006, 10:23
si, in pratica faccio questo per nn perdere campioni importanti e per simulare in modo pezzotto un real-time....
ora sto studiando come creare un nuovo thread nell'applicazione, che si deve occupare di plottare il grafico.
Hai suggerimenti/guide da darmi?
GRAZIE A TUTTI!!!!
si ma ti bastano molti meno campioni :D ... già bastebbero 5hz per riuscire a ricostruire il tuo segnale ... tralasciando questo fatto per fare dei grafici usi picturebox e da li ti fai un modulo che attraverso il plottaggio di righe ti crea un grafico ;)
Altrimenti non ci ho mai provato ma potresti importare il modulo di excel e provare a plottare con quel modulo.
~§~ Sempre E Solo Lei ~§~
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.