View Full Version : Delay per C
Vash1986
20-07-2006, 20:24
Esiste un modo più intelligente di questo:
void wait ( int seconds )
{
clock_t endwait;
endwait = clock () + seconds * CLOCKS_PER_SEC ;
while (clock() < endwait) {}
}
per implementare una funzione di delay in C? Senza usare lo sleep() della standard library di unix ^_^
Con quel while tutta la cpu è impegnata a verificare costantemente la condizione e va al 100% per tutto il tempo del delay.
trallallero
21-07-2006, 07:50
cé la select(...)
A me serviva (su unix) una sleep al millesimo di secondo e mi son fatto questo (se serve te la spiego):
#include <stdio.h>
#include <sys/time.h>
#include <unistd.h>
#define MAX_USEC 999999
#define USAGE_STR \
"\nSINTASSI: <Sleep> <millesimi di secondo (max 1000)>\n\n"
void main( int argc, char **argv )
{
struct timeval tv;
if ( argc == 1 )
puts( USAGE_STR ), exit(0);
tv.tv_sec = 0;
tv.tv_usec = atol(argv[1]) * 1000 + 998;
if (tv.tv_usec > MAX_USEC)
tv.tv_usec = MAX_USEC;
select( 1, NULL, NULL, NULL, &tv );
}
ciao :)
EDIT: quel 998 peró non me lo ricordo :wtf:
Vash1986
21-07-2006, 10:09
EDIT: sparato una caxxata :sofico:
ilsensine
21-07-2006, 10:12
#include <unistd.h>
E' proprio questo che volevo evitare, dal momento che programmo sia su win che su linux ^_^"
Select c'è anche su windows.
Comunque ti consiglio di usare sleep/usleep su linux, e Sleep su windows. Non è un dramma :)
#ifdef __linux__
#define wait(seconds) sleep(seconds)
#else
#define wait(seconds) Sleep(seconds*1000)
#endif
Vash1986
21-07-2006, 10:16
Hai ragione, mi son accorto di poter usare unistd.h anche in windows.
Però mi pare di capire che la funzione sleep unix vuole come parametro i secondi, mentre su windows vuole millesimi di secondo, giusto?
ilsensine
21-07-2006, 10:18
Sì. Su linux per sleep più fini, devi usare usleep() oppure nanosleep()
trallallero
21-07-2006, 10:34
Sì. Su linux per sleep più fini, devi usare usleep() oppure nanosleep()
io con Sun mi son fatto la mia Sleep perché avevo avuto dei problemi con la usleep ... peró non mi ricordo quali problemi
Vash1986
21-07-2006, 10:41
#include <stdio.h>
#include <unistd.h>
#ifdef __linux__
#define wait(millisec) usleep(millisec*1000)
#define waits(seconds) sleep(seconds)
#else
#define wait(millisec) sleep(millisec)
#define waits(seconds) sleep(seconds*1000)
#endif
/* USAGE: wait( unsigned int n );
* Pauses process for n milliseconds.
* n range: 1-999.
*/
/* USAGE: waits( unsigned int n );
* Pauses process for n seconds.
* n range: 1-4000.
*/
int main()
{
printf("Entering mainloop, kill process to stop.");
while ( 1 )
wait(1);
return 0;
}
Fantastico, consumo cpu 0% con una iterazione ogni millisecondo :D
ilsensine
21-07-2006, 10:42
io con Sun mi son fatto la mia Sleep perché avevo avuto dei problemi con la usleep ... peró non mi ricordo quali problemi
La granularità è quella del tick di sistema (1000 HZ su linux kernel 2.6 -- c'è chi ha usato anche di più). La usleep garantisce l'attesa per _almeno_ il valore indicato, che nella pratica viene arrotondato al tick di sistema successivo. Forse su Sun hai osservato questo fenomeno.
Per una precisione superiore le soluzioni sono molteplici, nessuna delle quali banale.
Vash1986
21-07-2006, 10:46
trallallero usi Sun Solaris? Come mai?
trallallero
21-07-2006, 10:52
boh ? ho compilato e funge la usleep() ... :what:
vabbé, io c'avevo provato 3 anni fa e non ricordo i problemi
ma sicuramente non sapevo una mazza di Solaris ...
trallallero usi Sun Solaris? Come mai?
perché sono un patito delle Spark, le adoro:
lente, pesanti, costosissime, antiquate :rolleyes:
sto in banca :D
Vash1986
21-07-2006, 11:18
Per una precisione superiore le soluzioni sono molteplici, nessuna delle quali banale.
Come l'utilizzo di select che ha fatto trallallero intendi?
In questo caso ho una domanda, la funzione select in che libreria sta? Non me la riconosce.
E poi che diff c'è tra
#include <time.h>
e
#include <sys/time.h>?
Senza il sys/ non mi riconosce la struct timeval.
trallallero
21-07-2006, 11:25
Come l'utilizzo di select che ha fatt trallallero intendi?
In questo caso ho una domanda, la funzione select in che libreria sta?
libreria non so ma cmq nelle standard C, non devi specificare niente. L'header é: "sys/time.h"
E poi che diff c'è tra
#include <time.h>
e
#include <sys/time.h>?
Senza il sys/ non mi riconosce la struct timeval.
sono semplicemente header files diversi.
timeval é definita in sys/time.h
li trovi nella dir: /usr/include/...
Vash1986
21-07-2006, 11:37
li trovi nella dir: /usr/include/...
Lol però io al momento sto su windows, e dubito che ci sia una cartella /usr/include. Non esiste una documentazione per l'intera standard library?
http://en.wikipedia.org/wiki/C_standard_library
A quanto pare sys/time.h e unistd.h dovrebbero esistere solo in unix.
Inoltre la povera select nn va...
Linking console executable: console.exe
.objs\main.o:main.c:(.text+0x6b): undefined reference to `select'
trallallero
21-07-2006, 12:08
Lol però io al momento sto su windows
pensavo linux :D
vabbé, allora io mi fermo qui. Tanto é pieno di Windowsiani in questo forum ;)
Vash1986
21-07-2006, 12:40
pensavo linux :D
vabbé, allora io mi fermo qui. Tanto é pieno di Windowsiani in questo forum ;)
Speriamo, anke xkè il mio scopo è creare un header di funzioni delay che vada perfettamente sia su unix che su windows, così da non dover smadonnare in futuro ogni volta ke in un programma devo mettere uno sleep :muro:
#include "myDelay.h" e buona notte :P
#ifdef __linux__
#include <unistd.h>
#define wait(millisec) usleep(millisec*1000)
#define waits(seconds) sleep(seconds)
#else
#define wait(millisec) sleep(millisec)
#define waits(seconds) sleep(seconds*1000)
#endif
Questo è già il primo passo, mi rimane solo da fare una funzione di precisione estrema, che sia indipendente dai tick del s.o.
ilsensine
21-07-2006, 13:16
Come l'utilizzo di select che ha fatto trallallero intendi?
No la select ha le stesse limitazioni delle funzioni di sleep
In questo caso ho una domanda, la funzione select in che libreria sta? Non me la riconosce.
E poi che diff c'è tra
#include <time.h>
e
#include <sys/time.h>?
time.h definisce la (ANSI, BSD) funzione time().
sys/time.h definisce la (POSIX) gettimeofday, e rispettiva struct timeval.
Vash1986
21-07-2006, 14:14
No la select ha le stesse limitazioni delle funzioni di sleep
Un suggerimento su come procedere allora? :)
ilsensine
21-07-2006, 14:57
Un suggerimento su come procedere allora? :)
Puoi utilizzare (anche più di uno insieme): driver RTC, kernel RT di Ingo Molnar, hi-res timer (tramite l'apposita interfaccia POSIX), task con scheduling realtime (SCHED_RR oppure SCHED_FIFO). Obbligatorio un kernel 2.6 con premption attiva.
Puoi raggiungere precisioni nell'ordine dei microsecondi.
Il tutto è specifico per linux; non ho idea di come si generino dei delay precisi sotto windows.
Vash1986
21-07-2006, 15:14
Puoi utilizzare (anche più di uno insieme): driver RTC, kernel RT di Ingo Molnar, hi-res timer (tramite l'apposita interfaccia POSIX), task con scheduling realtime (SCHED_RR oppure SCHED_FIFO). Obbligatorio un kernel 2.6 con premption attiva.
Puoi raggiungere precisioni nell'ordine dei microsecondi.
Il tutto è specifico per linux; non ho idea di come si generino dei delay precisi sotto windows.
:eek:
ok, vada per l'impreciso ma semplice sleep() :stordita:
Marco Giunio Silano
24-07-2006, 08:14
Esiste un modo più intelligente di questo:
void wait ( int seconds )
{
clock_t endwait;
endwait = clock () + seconds * CLOCKS_PER_SEC ;
while (clock() < endwait) {}
}
per implementare una funzione di delay in C? Senza usare lo sleep() della standard library di unix ^_^
Con quel while tutta la cpu è impegnata a verificare costantemente la condizione e va al 100% per tutto il tempo del delay.
.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.