2009-11-12 9 views
7

¿Cuál es la función para obtener la fecha y la hora en que se ejecutó una aplicación? Estoy usando Delphi.¿Cuándo comenzó mi aplicación a ejecutarse?

+0

¿Qué "tiempo de inicialización? ¿Puedes ser mas específico? ¿Estás buscando cuánto tiempo tarda tu aplicación en comenzar? ¿O a qué hora del día se inició? –

+1

sí, la hora del día en que comenzó. –

+1

Peter, su pregunta no es realmente específica de Delphi, y tampoco las respuestas, así que he cambiado la pregunta para que los programadores que no sean de Delphi tengan menos probabilidades de descartarla como irrelevante cuando tienen una pregunta similar. –

Respuesta

15

Puede utilizar la llamada a la API de Windows para GetProcessTimes (declarado en Windows.pas) para obtener detalles de cualquier proceso.

Si es su aplicación, es probable que yo también tenga la hora de inicio y la registre en algún lugar para mantener un historial.

+0

+1 para GetProcessTimes – RRUZ

+3

Y la forma más simple de usarlo es DSiGetProcessTimes de DSiWin32, http://gp.17slon.com/gp/dsiwin32.htm. – gabr

4

No estoy seguro de si hay una función o llamada de API para esto. Pero puedes fingir con bastante facilidad. Crear una unidad que tiene este aspecto:

unit AppStartTime; 

interface 

function GetAppStartTime: TDateTime; 

implementation 
uses 
    SysUtils; 

var 
    fStartTime: TDateTime; 

function GetAppStartTime: TDateTime; 
begin 
    result := fStartTime; 
end; 

initialization 
    fStartTime := Now; 

end. 

añadirlo a la su DPR utiliza lista, en la parte superior, ya sea primera o inmediatamente después de todo lo que "debe ser el primero en la lista", tal como una memoria personalizada gerente.

+1

Si quiere ser realmente preciso y su aplicación tiene un arranque prolongado, coloque esta unidad como la primera en su cláusula de uso. –

+1

Si quiere ser * realmente * preciso, debe usar 'GetProcessTimes()', ya que incluso el código en la inicialización de la primera unidad se ejecutará solo después de que se hayan cargado todos los módulos y se hayan resuelto todos los puntos de entrada del módulo , lo que puede llevar bastante tiempo con un bajo ancho de banda de E/S y nada precargado o en caché. – mghie

1

Puede hacer que su aplicación registre el tiempo de inicio en un archivo de texto o base de datos, ya sea en el archivo DPR o en el evento OnCreate() de su formulario principal. Puede usar la función Now() de Delphi para obtener la fecha y hora actual, y formatearla como una cadena usando FormatDateTime() o DateTimeToStr(), dependiendo de lo que esté buscando hacer exactamente.

El siguiente código guarda la fecha de inicio y la hora durante el constructor de la forma principal a un archivo de texto en la misma carpeta que la propia aplicación llamada StartDateTime.txt:

procedure TForm1.FormCreate(Sender: TObject); 
var 
    SL: TStringList; 
begin 
    SL := TStringList.Create; 
    try 
    SL.Add(FormatDateTime('mm/dd/yyyy hh:nn:ss', Now()); 
    SL.SaveToFile(ExtractFilePath(ParamStr(0)) + 'StartDateTime.txt'); 
    finally 
    SL.Free; 
    end; 
end; 
+0

¿Su respuesta contradice a Bruces? –

+0

Peter. No. Su respuesta está cerca de la segunda parte de mi respuesta, excepto que Ken publicó su primer código fuente incluido. Si esa es la forma en que elige ir, debe seleccionar la respuesta de Ken como la correcta. –

+0

Aún prefiero que se elimine la primera oración de la respuesta; está claramente equivocado. – mghie

2

Uso NtQuerySystemInformation con el informationclass SystemProcessInformation, esto devuelve una matriz de estructuras SYSTEM_PROCESSES (registros) de los cuales el CreateTime contiene la hora exacta en que se inició la aplicación:

_SYSTEM_PROCESSES = record // Information Class 5 
    NextEntryDelta: ULONG; 
    ThreadCount: ULONG; 
    Reserved1: array[0..5] of ULONG; 
    CreateTime: LARGE_INTEGER; 
    UserTime: LARGE_INTEGER; 
    KernelTime: LARGE_INTEGER; 
    ProcessName: UNICODE_STRING; 
    BasePriority: KPRIORITY; 
    ProcessId: ULONG; 
    InheritedFromProcessId: ULONG; 
    HandleCount: ULONG; 
    // next two were Reserved2: array [0..1] of ULONG; thanks to Nico Bendlin 
    SessionId: ULONG; 
    Reserved2: ULONG; 
    VmCounters: VM_COUNTERS; 
    PrivatePageCount: ULONG; 
    IoCounters: IO_COUNTERSEX; // Windows 2000 only 
    Threads: array[0..0] of SYSTEM_THREADS; 
    end; 
    SYSTEM_PROCESSES = _SYSTEM_PROCESSES; 
    PSYSTEM_PROCESSES = ^SYSTEM_PROCESSES; 
    TSystemProcesses = SYSTEM_PROCESSES; 
    PSystemProcesses = PSYSTEM_PROCESSES; 

Ya hemos traducido todo esto en el Jedi Apilib (JwaNative)

+0

Esa no es la estructura documentada en MSDN, por lo que dudaría en confiar en su precisión. –

+1

Bueno, Microsoft ha mantenido esta función sin documentar y ahora está parcialmente documentada. La estructura se ha invertido hace mucho tiempo, así que creo que es muy seguro de usar. – Remko

+0

Muchas gracias Remko por esto, ¿pueden decirnos más acerca de cómo convertir de 'CreateTime' a la hora del sistema, son los microsegundos desde la época? PS - La estructura exacta es aquí - http://processhacker.sourceforge.net/doc/struct___s_y_s_t_e_m___p_r_o_c_e_s_s___i_n_f_o_r_m_a_t_i_o_n.html – Noitidart

Cuestiones relacionadas