|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jan 2004
Messaggi: 388
|
Delay per C
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.
__________________
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
cé la select(...)
A me serviva (su unix) una sleep al millesimo di secondo e mi son fatto questo (se serve te la spiego): Codice:
#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 );
}
EDIT: quel 998 peró non me lo ricordo
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Jan 2004
Messaggi: 388
|
EDIT: sparato una caxxata
__________________
Ultima modifica di Vash1986 : 21-07-2006 alle 11:14. |
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
Comunque ti consiglio di usare sleep/usleep su linux, e Sleep su windows. Non è un dramma Codice:
#ifdef __linux__ #define wait(seconds) sleep(seconds) #else #define wait(seconds) Sleep(seconds*1000) #endif
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Jan 2004
Messaggi: 388
|
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?
__________________
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Sì. Su linux per sleep più fini, devi usare usleep() oppure nanosleep()
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Jan 2004
Messaggi: 388
|
Codice:
#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;
}
__________________
Ultima modifica di Vash1986 : 21-07-2006 alle 11:44. |
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
Per una precisione superiore le soluzioni sono molteplici, nessuna delle quali banale.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Jan 2004
Messaggi: 388
|
trallallero usi Sun Solaris? Come mai?
__________________
|
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
boh ? ho compilato e funge la usleep() ...
![]() vabbé, io c'avevo provato 3 anni fa e non ricordo i problemi ma sicuramente non sapevo una mazza di Solaris ... Quote:
lente, pesanti, costosissime, antiquate sto in banca
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Jan 2004
Messaggi: 388
|
Quote:
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.
__________________
Ultima modifica di Vash1986 : 21-07-2006 alle 12:22. |
|
|
|
|
|
|
#13 | ||
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
Quote:
timeval é definita in sys/time.h li trovi nella dir: /usr/include/...
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
||
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Jan 2004
Messaggi: 388
|
Quote:
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'
__________________
Ultima modifica di Vash1986 : 21-07-2006 alle 12:44. |
|
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
vabbé, allora io mi fermo qui. Tanto é pieno di Windowsiani in questo forum
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: Jan 2004
Messaggi: 388
|
Quote:
#include "myDelay.h" e buona notte :P Codice:
#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
__________________
|
|
|
|
|
|
|
#17 | ||
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
Quote:
sys/time.h definisce la (POSIX) gettimeofday, e rispettiva struct timeval.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
||
|
|
|
|
|
#18 | |
|
Senior Member
Iscritto dal: Jan 2004
Messaggi: 388
|
Quote:
__________________
|
|
|
|
|
|
|
#19 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
Puoi raggiungere precisioni nell'ordine dei microsecondi. Il tutto è specifico per linux; non ho idea di come si generino dei delay precisi sotto windows.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
|
#20 | |
|
Senior Member
Iscritto dal: Jan 2004
Messaggi: 388
|
Quote:
ok, vada per l'impreciso ma semplice sleep()
__________________
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 08:22.




















