Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Thread temporizzato
Forum - C/C++ - Thread temporizzato

Avatar
Alessio Gandini (Normal User)
Newbie


Messaggi: 3
Iscritto: 30/07/2009

Segnala al moderatore
Postato alle 11:05
Giovedì, 30/07/2009
Salve a tutti,

ho cercato su google ma non ho trovato nulla che faccia al caso mio.
Dunque, sto sviluppando una DLL in C che crea più Thread di lavoro, e mi occorre una funzione che Permetta di "congelare" il thread per un certo numero di uS.

Io ho usato la Sleep() che però accetta un valore fino al mS, che comunque non rispetta, l'attesa minima è attorno ai 10 mS (Calcolato sperimentalmente).

Ora, non mi serve la precisione, se anche sbaglia di 50 uS non importa, basta poter andare sotto il mS, perchè mi serve che il Thread sia molto veloce nella sua esecuzione, ma che non impegni troppe risorse.

Faccio un esempio, mettiamo che questo sia il codice del Thread :

while ( !ThreadStop )
{
    Funzione1();
    Funzione2();
    ...
}

Questo una volta in esecuzione provoca un utilizzo altissimo della CPU, perchè fatto a manetta.
Se metto :

while ( !ThreadStop )
{
    Funzione1();
    Funzione2();
    ...
    Sleep(10);
}

L'utilizzo della CPU non è apprezzabile, quindi è minimo.
Io però vorrei poter sostituire alla Sleep una funzione o un blocco di codice che ritardi l'esecuzione di alcuni uS, quindi più rapido, ma senza impegnare la CPU come utilizzando dei cicli FOR (presumo che la sleep utilizzi un Timer, ma non lo so).

Grazie in anticipo.
Alessio Gandini

PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 11:12
Giovedì, 30/07/2009
Partendo dal concetto che Windows non e' un sistema real time, puoi avere difficoltà nel fare quello che chiedi ...

Se sei in attesa di qualche evento nel thread, puoi usare le API WaitFor... per sincronizzare il tutto ...


PM Quote
Avatar
Alessio Gandini (Normal User)
Newbie


Messaggi: 3
Iscritto: 30/07/2009

Segnala al moderatore
Postato alle 11:21
Giovedì, 30/07/2009
Testo quotato

Postato originariamente da theprogrammer:

Partendo dal concetto che Windows non e' un sistema real time, puoi avere difficoltà nel fare quello che chiedi ...

Se sei in attesa di qualche evento nel thread, puoi usare le API WaitFor... per sincronizzare il tutto ...




No, non sono in attesa di eventi, si tratta di alcune funzioni che devono essere eseguite molto velocemente, ma non alla massima velocità del processore, più che altro per non impegnarlo troppo. Mi occorre quindi qualcosa che fermi il ciclo, e lo riprenda dopo breve tempo (ordine dei uS, ma non utilizzando cicli di ritardo, perché allora è come non usarli, la CPU viene sfruttata inutilmente).

Mi chiedevo se esistesse un modo in assembly, da inserire inline in C....
Beh, purtroppo ne ho bisogno, e spero che sia possibile farlo, altrimenti sarò costretto ad utilizzare molte risorse, con tutti gli effetti indesiderati che comporta...

Grazie per la risposta tempestiva, resto speranzoso in attesa... anche se già demoralizzato

PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 11:26
Giovedì, 30/07/2009
Purtroppo devo darti una delusione ... non puoi farlo ...

Solo con i Multimedia Timer puoi arrivare a risoluzioni di 1 ms (non meno) e comunque non abbasseresti il consumo di CPU perche' non puoi "adddormentare" il thread per poco tempo.

Devi usare le estensioni "real time" di Windows (che esistono ma non sono gratuite ...).

PM Quote
Avatar
Alessio Gandini (Normal User)
Newbie


Messaggi: 3
Iscritto: 30/07/2009

Segnala al moderatore
Postato alle 11:36
Giovedì, 30/07/2009
:(

Peccato... mi rassegno.
Proverò a testare il tutto con la Sleep(1) e vedere se è abbastanza veloce, anche se i test di ieri non erano ottimali...

Al limite utilizzerò il ciclo senza ritardo.

Grazie mille. A theprogrammer sopratutto, ma anche a tutto il forum e lo staff.

PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 11:39
Giovedì, 30/07/2009
Di nulla ... comunque, Sleep(1) e' "falso" perche' viene assunto comunque il valore minimo gestito dal sistema, che e' diverso da server a workstation ma non e' mai sotto i 10 ms ...

PM Quote
Avatar
lorenzo (Normal User)
Guru


Messaggi: 1178
Iscritto: 15/04/2008

Segnala al moderatore
Postato alle 13:55
Giovedì, 30/07/2009
magari dico una cavolata, ma non si potrebbe usare il buon vecchio metodo delle istuzioni di ritardo? provare ad inserire qualche istruzione che non fa nulla/fa cose inutili ma che ritarda il ciclo quel tanto che basta per arrivare nell'ordine dei uS?

non sarà certo di una precisione impressionante ma potrebbe risolvere il problema

Ultima modifica effettuata da lorenzo il 30/07/2009 alle 13:56
PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 14:00
Giovedì, 30/07/2009
La questione non e' nel tempo impiegato dalle istruzioni per il ritardo.

La cosa e' diversa ... anche le istruzioni che sembrano non fare nulla (un semplice ciclo di conteggio) impegna la CPU e quindi quel processo fa andare la CPU al 100%.

L'unico modo per non impegnare risorse e' che lo scheduler del sistema operativo ponga il thread in stato "sospeso" e che poi lo "risvegli" quando serve. Solo in quell'intervallo la CPU non e' impegnata.

Ma Windows puo' fare questo lavoro, al minimo, per una decina di ms e non per microsecondi.

PM Quote