2013-02-23 20 views
5

Ero sicuro che questa domanda è stata fatta prima quindi ho ovviamente usato la funzione di ricerca per verificare se c'è una risposta per risolvere il mio problema.Timer ad alta risoluzione ObjC/C/C++ con callback

Tuttavia, tutto quello che ho trovato sono state molte risposte su misurando il tempo in alta precisione.

Quello che mi serve è un timer ad alta risoluzione (almeno un millisecondo) che mi consente di attivare una richiamata quando è trascorso un periodo di tempo definito. Mi piacerebbe usarlo in un'applicazione Cocoa Mac OS X, quindi C/C++ o Obj-C sarebbero possibili. Se sono necessarie librerie aggiuntive, anche questo va bene.

Ho trovato questo http://www.songho.ca/misc/timer/timer.html ma sta utilizzando una strategia di attesa occupata e costerebbe troppe prestazioni presumo.

L'aiuto è molto apprezzato!

+3

C o C++? Sceglierne uno. –

+0

Non conosco Cocoa, ma dovresti leggere di più sul suo meccanismo del ciclo degli eventi; sicuramente ti darà dei timer o dei sondaggi .... Fondamentalmente dovresti scoprire come registrare un callback di un evento timeout. –

+0

Questa domanda sembra avere la tua risposta: http://stackoverflow.com/questions/464618/whats-the-equivalent-of-windows-queryperformancecounter-on-osx (seconda risposta: su OSX mach_absolute_time e mach_timebase_info sono i migliori equivalenti a Funzioni di Win32 QueryPerformance *) –

risposta

6

Una grande tecnologia che è possibile utilizzare proviene direttamente da Apple. Fonti Timer di spedizione:

http://developer.apple.com/library/mac/#documentation/General/Conceptual/ConcurrencyProgrammingGuide/GCDWorkQueues/GCDWorkQueues.html

ci vorrà un po 'di leggere questo, ma una volta che si ottiene, è abbastanza facile da usare. È possibile specificare l'intervallo di tempo in nanosecondi e il blocco che dovrebbe essere eseguito periodicamente.

È una parte della tecnologia GCD ed è basata su C. Poiché Objective-C è solo C più alcune aggiunte, sembra più naturale attenersi a C. Entrare in C++ e quindi Objective-C++ sembra un eccesso in questo caso.

+0

Questo sembra fantastico! Non sapevo che GCD può farlo anche tu! Grazie per la risposta! – guitarflow

+0

Questo dovrebbe essere elevato nei risultati di ricerca per le ricerche precise del timer Cocoa. Questo e spettacolare. – uchuugaka

6

È possibile utilizzare GCD direttamente da Apple. Su Mac OS X, GCD è disponibile dalla versione 10.7.

double delayInMilliseconds = 100.0; 
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInMilliseconds * NSEC_PER_MSEC)); 
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
    // callback invocation 
}); 
+0

Perfetto! Grazie. Lo esamineremo. – guitarflow

Problemi correlati