View Full Version : [c++ win32] contatore in tempo reale
ho un dialogbox che ha una sua specifica funzione (BOOL CALLBACK DlgProc ecc...) dove ho un edittext (un form) dove devo inserire un contatore in tempo reale (del tipo 00:01, 00:02 ecc)
il contatore è questo:
void wait ( int seconds )
{
clock_t endwait;
endwait = clock () + seconds * CLK_TCK ;
while (clock() < endwait) {}
}
char tempoz[10];
void contatore()
{
int tempo=0;
while(true)
{
wait(1); //aspetta un secondo
tempo=tempo++;
itoa(tempo, tempoz, 10); //trasformo l'int in array
SetDlgItemText(hwnd,IDC_TEMPO, tempoz); //inserisco il tempo nella edittext
break;
}
}
ora, il contatore funziona benissimo, il problema è dove metterlo nella funzione della dialogbox: infatti il ciclo mi ferma tutta la funzione stessa. Quindi mi chiedevo se c'è un modo di eseguire due funzioni contemporaneamente (può essere una soluzione) o qualsiasi altra cosa
grazie :)
a me sembra un ottima idea usare i thread:D
Originariamente inviato da Luc@s
a me sembra un ottima idea usare i thread:D
hum cioè? :oink:
dirami dal prog un thread a cui deleghi il compito di contare .........
Se su win32 giusto???
Allora have a look (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/createthread.asp)
non è tutto _tremendamente_ più semplice usando un timer?
nell'InitIstance del dialogo lo fai partire con un SetTimer a 1000ms e poi gestisci l'evento OnTimer controllando l'ID che hai assegnato al tuo timer
cito quello che ho scritto
dove ho un edittext dove devo inserire un contatore in tempo reale (del tipo 00:01, 00:02 ecc)
io devo visualizzare il timer il una edittext!
la funzione SetTimer non ritorna i secondi a cui è arrivata in un dato istante, giusto?
c'è la funzione QueryPerformanceCounter che però ha come argomento un LARGE_INTEGER :confused: e siccome uso itoa per trasformare l'int in char per poi mandarlo alla edittext, non saprei proprio come fare
comunque, questo forse mi risolve un problema, ma ne volevo fare anche uno che va avanti :)
Memorizza la data di sistema in secondi all'inzio del conteggio...
Usa SetTimer per settare un altro timer ogni decimo di secondo...
Controlla la data di sistema attuale e fai la differenza da quella precedente... A questo punto metti il risultato nella editbox...
ma in questo caso devo fare un loop, ogni volta mi deve controllare la data di sistema e fare la differenza...
il fatto è che il problema pare essere risolto con il createthread, ma si crea un altro problema, cioè la funzione contatore non passa niente alla funzione della dialogbox, e quindi non posso inviare il numero all'editbox della dialogbox stessa:muro:
Che intendi per niente ? Al thread un parametro lo puoi passare ;)
eccheglipasso? :mc:
potrei passagli un handle, se sapessi cos'è un LPVOID...
LPVOID è un void *...
LP nei tipi di Windows significa long pointer... Quando c'è una C significa contante...
Quindi gli puoi passare qualsiasi puntatore... Ad esempio il puntatore alla editbox... L'importante è poi farci un cast al tipo originale per poter usare il puntatore per scrivere il valore nella editbox con SetWindowText...
ecco stavo provando proprio questo, gli passo l'handle all'editbox (l'handle è un puntatore no?), che però mi trasforma in LPVOID a quanto pare, e quindi poi non posso fare SetWindowText(p, tempoz)
infatti mi dice invalid conversion
spiegami meglio il cast al tipo originale :)
:sofico:
bastava che dichiaravo l'handle fuori dalla funzione :stordita: :D
Originariamente inviato da kk3z
bastava che dichiaravo l'handle fuori dalla funzione :stordita: :D
Non so se stai programmando ad oggetti o no... Nel caso che tu stia programmando ad oggetti è una pratica piuttosto brutta...
mi spieghi la difficoltà di sta roba?
Mi sa che non usa MFC ;)
Comunque anche io avrei fatto come te...anche se avrei messo il timer a 1/10 di secondo...per evitare errori... Non c'è garanzia che la procedura del timer venga eseguita entro un certo lasso di tempo...e ad un certo punto potrebbe capitare che il contatore salti di due secondi...
si hai ragione, ma basta cambiare appunto i millisecondi di passaggio e il codice è già apposto
quello che non capisco invece è perchè si sta complicando la vita coi thread... o meglio, con i thread fatti a mano
NON sto usando MFC e soprattutto NON ho visual c++
vedi un altro modo di farlo con le API? il loop nella funzione della dialogbox non posso farla...
anche quello che mi aveva proposto cionci
Memorizza la data di sistema in secondi all'inzio del conteggio...
Usa SetTimer per settare un altro timer ogni decimo di secondo...
Controlla la data di sistema attuale e fai la differenza da quella precedente... A questo punto metti il risultato nella editbox... ha bisogno di un loop, quindi nulla...
non vedo altri modi
Quello che ti ho detto io, che in pratica è lo stesso metodo usato da ri, non è un loop ;)
In pratica metti un timer a 100ms e prendi la data di sistema in secondi...la confronti cn quella iniziale, fai la differenza e la visualizzi nella editbox...
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.