PDA

View Full Version : [c++ win32] contatore in tempo reale


kk3z
27-06-2004, 11:55
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 :)

Luc@s
27-06-2004, 12:35
a me sembra un ottima idea usare i thread:D

kk3z
27-06-2004, 12:48
Originariamente inviato da Luc@s
a me sembra un ottima idea usare i thread:D

hum cioè? :oink:

Luc@s
27-06-2004, 12:52
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)

ri
27-06-2004, 16:52
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

cionci
27-06-2004, 18:47
Sì ;)

kk3z
28-06-2004, 10:45
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 :)

cionci
28-06-2004, 12:33
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...

kk3z
28-06-2004, 13:00
ma in questo caso devo fare un loop, ogni volta mi deve controllare la data di sistema e fare la differenza...

kk3z
28-06-2004, 13:06
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:

cionci
28-06-2004, 15:01
Che intendi per niente ? Al thread un parametro lo puoi passare ;)

kk3z
28-06-2004, 15:20
eccheglipasso? :mc:
potrei passagli un handle, se sapessi cos'è un LPVOID...

cionci
28-06-2004, 15:26
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...

kk3z
28-06-2004, 15:33
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 :)

kk3z
28-06-2004, 16:08
:sofico:





























bastava che dichiaravo l'handle fuori dalla funzione :stordita: :D

cionci
28-06-2004, 16:45
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...

ri
28-06-2004, 16:57
mi spieghi la difficoltà di sta roba?

cionci
28-06-2004, 17:02
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...

ri
28-06-2004, 17:44
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

kk3z
28-06-2004, 20:10
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

cionci
28-06-2004, 20:24
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...