Russian Qt Forum

Qt => Дополнительные компоненты => Тема начата: korel от Декабрь 02, 2010, 13:31



Название: Загружено одно ядро процессора на 100% при использовании QWinHost
Отправлено: korel от Декабрь 02, 2010, 13:31
           Когда на qt окне(в моем случае QMainWindow) создаю HostWidget (дочерний класс QWinHost), одно ядро процессора загружается на 100%. Впедварительно в createWindow() :

Код:
HWND HostWindow::createWindow(HWND i_parent, HINSTANCE i_instance)//todo check for if needless
  {
  mp_wnd = new CWnd;
  BOOL created = mp_stl_wnd->CreateEx(WS_EX_CLIENTEDGE,
                                     _T("STATIC"),
                                     0,
                                     WS_CHILD | WS_VISIBLE,
                                     0, 0, 350, 200,
                                     i_parent, (HMENU)1001, 0);

  if(created)
    return mp_wnd->GetSafeHwnd();
  return NULL;
  }

С чем это может быть связано и как это пофиксить?


Название: Re: Загружено одно ядро процессора на 100% при использовании QWinHost
Отправлено: korel от Декабрь 02, 2010, 13:56
То, что было замечено, что в qeventdispatcher_win.cpp:
Код:
bool QEventDispatcherWin32::processEvents(QEventLoop::ProcessEventsFlags flags)
{
//..
while (!d->interrupt)
  {
    //..
  }
//..
}

цикл while выполняется милион раз за пару секунд(до 5ти секунд). Этот цикл обрабатывает сообщения системы(Windows) - он должен спать если сообщений нету. И непонятно, почему он выполняется такое количество раз????


Название: Re: Загружено одно ядро процессора на 100% при использовании QWinHost
Отправлено: korel от Декабрь 02, 2010, 18:04
Вот, что прооисходило:

Когда приходит сообщение WM_PAINT ищутся его обработчики, и если их нету, то это сообщение кидается в конец очереди сообщений для того, чтобы когда нить обработаться. Таким образом получалось, что сообщения WM_PAINT шли в огромном количестве.

Поскольку в MFC_шном  CWnd методе OnPaint() я не написал BeginPaint-EndPaint (или как альтернативу CPaintDC paint_dc(this) ) обработчик событий не знал, что WM_PAINT есть кому обработать.

собственно все! ;D