2009-03-27 21 views
8

Tengo una aplicación Cocoa que registra las fechas en los eventos. Necesito saber cuándo se restablece el tiempo del sistema y cuánto, pero parece que no puedo enviar una notificación a ninguna parte que me diga que algo así ha sucedido. Este cambio podría ocurrir debido a que NTP reinicia el reloj o porque el usuario reinicia (por ejemplo, desde las Preferencias del sistema). Sería genial si hubiera una NSNotification que pudiera registrar para recibir, pero estoy abierto a cualquier sugerencia.¿Cómo puedo recibir notificaciones sobre un cambio de horario del sistema en mi aplicación Cocoa?

+1

Qué quiere decir cuando cambia el reloj, por ejemplo, mediante una sincronización NTP, o cambiando la zona horaria o configurando manualmente la hora en Preferencias del Sistema? –

+0

Sí, eso es lo que quiero decir. Lamento no haber tenido muy claro para empezar. Espero haber dejado esto más claro ahora. –

Respuesta

13

Apple agregado en NSSystemClockDidChangeNotification, parte de NSDate, en Snow Leopard (10.6). No parece haber una manera de hacerlo en Leopard (10.5) o anterior. Por el Apple NSDate docs:

Publicado cada vez que se cambia el reloj del sistema. Esto puede iniciarse mediante una llamada a settimeofday() o al usuario que cambia los valores en el panel Preferencia de fecha y hora. El objeto de notificación es nulo. Esta notificación no contiene un diccionario userInfo.

Esto no parece indicar "cuánto" ha cambiado el tiempo. Posiblemente podría calcular eso periódicamente (por ejemplo, cada 5 segundos en un NSTimer) capturando la hora del sistema con [NSDate date], guardándola en una variable, y luego después de que se active NSSystemClockDidChangeNotification, tome la nueva fecha y compare las dos juntas usando NSDate's timeIntervalSinceDate: método para obtener la diferencia.

Sin precisión de milisegundos o incluso segundos, pero bastante cerca.

EDITAR: Ver this post. Posiblemente pueda usar el comando UpTime() C para capturar el tiempo de actividad del sistema en tics de CPU (que luego puede convertir a segundos). Puede usar esto para calcular cuánto tiempo ha cambiado (suponiendo que el sistema no se reinicie o no duerma). Esto funciona incluso si el reloj del sistema es cambiado por el usuario o el protocolo de tiempo de la red.

1

El tiempo se mueve constantemente. Una notificación cada vez que se cambie la hora actual sería una corriente de notificaciones constante y saturada de CPU.

Lo que debe hacer es obtener la hora actual en su controlador de eventos, el que recibe los eventos que marca la fecha. Obtenga la hora actual llamando al [NSDate date].

+8

Bueno, ¿no es obvio que el OP significa un cambio inusual de tiempo y no el avance normal del reloj :) – phlebotinum

0

No creo que haya una sola forma de hacerlo debido a los diferentes mecanismos por los que el tiempo podría cambiar. Pero no sería muy caro (¿es demasiado caro? No lo sé, ¿ya lo ha perfilado? ;-) para configurar un NSTimer una vez por segundo para comprobar el tiempo y compararlo con el valor anterior. Si no avanza en alrededor de un segundo, sucedió algo interesante y puede notificar a su objeto de auditoría.

10

Si algunos en busca de solución saben sistema de eventos fecha de cambio de cambio de 10,4


OSStatus DateChangeEventHandler(EventHandlerCallRef nextHandler, EventRef theEvent, void *userData) 
{ 
    NSLog(@"Event received!\n");  
    return 0; 
} 


- (void)SystemTimeChangeHandler 
{ 
    EventTypeSpec eventType; 
    eventType.eventClass = kEventClassSystem; 
    eventType.eventKind = kEventSystemTimeDateChanged; 

    EventHandlerUPP eventHandlerUPP = 
    NewEventHandlerUPP(DateChangeEventHandler); 
    EventHandlerRef eventHandlerRef = NULL; 
    (void)InstallApplicationEventHandler(
             eventHandlerUPP, 
             1, 
             &eventType, 
             self, 
             &eventHandlerRef); 

} 

Cuestiones relacionadas