2013-10-11 92 views
5

Abbiamo sviluppato una piccola suite di test per il nostro motore di rendering dell'interfaccia utente Windows Form che consente di misurare le prestazioni e rilevare perdite di memoria durante l'esecuzione di test case in modo automatico. Ora vorremmo verificare anche la presenza di perdite. Sulla piattaforma desktop possiamo utilizzare questo codice:Determinare il numero di handle GDI e oggetti USER

[DllImport("User32")] 
private extern static int GetGuiResources(IntPtr hProcess, int uiFlags); 

using (var process = Process.GetCurrentProcess()) 
{ 
    var gdiHandles = GetGuiResources(process.Handle, 0); 
    var userHandles = GetGuiResources(process.Handle, 1); 
} 

Questo metodo non sembra essere disponibile in Windows Mobile. C'è un altro modo per determinare questi valori a livello di codice su Windows Mobile/CE?

risposta

1

Questo è più di un suggerimento che di una risposta.

È possibile richiedere che tutti i metodi "handle" vengano inseriti in una classe separata (ho una classe denominata User32, coreDLL, ecc.).

Quindi, è possibile incrementare un contatore ogni volta che si utilizza una risorsa o aggiungere ogni nuovo handle creato a un elenco gestito privatamente prima di restituire tale handle.

Ora, prima che il progetto si chiuda, assicurarsi che il contatore sia tornato a zero o che tutte le maniglie dell'elenco siano chiuse.

Codice non testato - Non ho VS2008 qui al momento.

[DllImport("User32")] 
private extern static int GetGuiResources(IntPtr hProcess, int uiFlags); 

private static List<IntPtr> m_handles = new List<IntPtr>(); 

public static IntPtr[] GetGuiResources() { 
    using (var process = Process.GetCurrentProcess()) 
    { 
    var gdiHandles = GetGuiResources(process.Handle, 0); 
    m_handles.Add(gdiHandles); 
    var userHandles = GetGuiResources(process.Handle, 1); 
    m_handles.Add(userHandles); 
    } 
    return new IntPtr[] { m_handles[m_handles.Count - 2], m_handles[m_handles.Count - 1] }; 
} 

public static void Close() { 
    for (int i = m_handles.Count - 1; -1 < i; i--) { 
    var handle = m_handles[i]; 
    // release your handle 
    } 
} 

Ancora una volta, è solo un'idea. Non ho mai avuto questo problema prima, quindi non ho idea di come funzioni bene o se fallirebbe per qualche motivo "sconosciuto per me".

È proprio come vorrei iniziare logicamente l'avvio del progetto.

+0

Per quanto riguarda il tuo approccio, questo mi richiederebbe di riscrivere l'intera gestione delle risorse nella nostra applicazione attualmente gestita da Windows Forms (da qualche parte in profondità in 'Pen',' Graphics' e 'Bitmap') - solo per nell'interesse del test per la gestione delle perdite di risorse. Poiché tali test vengono solitamente eseguiti poco prima che venga rilasciata una nuova versione, osserverò piuttosto il comportamento delle applicazioni con gli strumenti esistenti. Comunque, grazie per il tuo suggerimento, apprezzo lo sforzo. – Gene

+0

Certo, non farlo prima di distribuire, no. Tuttavia, questo sarebbe un design migliore da tenere a mente per la tua applicazione. Pensa alle versioni future. :) – jp2code