[MFC] Veel CPU usage in CWinThread::PumpMessage

Pagina: 1
Acties:

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Ik ben bezig met het schrijven van een p2p client en ik zit met een vaag probleem. Normaal is CPU usage ongeveer 0%, maar sinds kort is het vaker 100% en dat is nogal storend.
Dus ik in Visual C++ 6 profilen met als resultaat:
code:
1
2
3
4
    Command line at 2004 Apr 11 20:57: "F:\VC\xbt\XBT Client\Debug\XBT Client"
    Time in module: 76438,544 millisecond
   75351,273  98,6    75773,696  99,1     1437 CWinThread::PumpMessage(void) (mfc42d.dll)
      75,806   0,1       75,806   0,1    58546 operator delete(void *) (mfc42d.dll)

Alle tijd wordt dus doorgebracht in een (simpele) MFC functie (ongeveer 52 ms per hit):
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
BOOL CWinThread::PumpMessage()
{
    ASSERT_VALID(this);

    if (!::GetMessage(&m_msgCur, NULL, NULL, NULL))
    {
#ifdef _DEBUG
        if (afxTraceFlags & traceAppMsg)
            TRACE0("CWinThread::PumpMessage - Received WM_QUIT.\n");
        m_nDisablePumpCount++; // application must die
            // Note: prevents calling message loop things in 'ExitInstance'
            // will never be decremented
#endif
        return FALSE;
    }

#ifdef _DEBUG
    if (m_nDisablePumpCount != 0)
    {
        TRACE0("Error: CWinThread::PumpMessage called when not permitted.\n");
        ASSERT(FALSE);
    }
#endif

#ifdef _DEBUG
    if (afxTraceFlags & traceAppMsg)
        _AfxTraceMsg(_T("PumpMessage"), &m_msgCur);
#endif

    // process this message

    if (m_msgCur.message != WM_KICKIDLE && !PreTranslateMessage(&m_msgCur))
    {
        ::TranslateMessage(&m_msgCur);
        ::DispatchMessage(&m_msgCur);
    }
    return TRUE;
}

Volgens mij gaat er iets gruwelijk fout, want ik zou niet weten waar die functie mee bezig is. Wat is hier aan de hand?

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 21-05 14:59

pjvandesande

GC.Collect(head);

Met wat voor code roep je dit aan, doe je dit in een lus en staat die in een apparte thread of in de main thread?

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Dit is standaard MFC code, ik roep dit niet direct aan. De tweede thread is geen MFC thread en heeft geen message pump, dus dit is de main thread.