MainLoop с добавлениями Topic is solved

Это русская секция форума wxWidjets. В этой секции вы можете обсуждать любые вопросы, связанные с wxWidgets на вашем родном языке.
Post Reply
sergiokey
Knows some wx things
Knows some wx things
Posts: 30
Joined: Sat Mar 21, 2009 6:55 am

MainLoop с добавлениями

Post by sergiokey »

здравствуйте
нужно сделать нечто подобное

Code: Select all

MSG msg;
while (true) { 
  if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    if (msg.message == WM_QUIT) break; 
  }
  // свой код
}
но это на win-api, а как это реализовать на wxWidgets?
есть такие функции:

Code: Select all

virtual int wxApp::MainLoop();
virtual int OnRun();
но с какой стороны подойти, как сделать чтобы не порушить функциональность не знаю

подскажите пожалуйста :roll:
есть еще OnIdle но оно не подходит
Visual Studio 2008 Express
wxWidgets 2.8.10
Windows XP sp2
Kolya
Experienced Solver
Experienced Solver
Posts: 85
Joined: Mon Dec 11, 2006 11:35 am
Location: /dev/null

Re: MainLoop с добавлениями

Post by Kolya »

sergiokey wrote:есть еще OnIdle но оно не подходит
Подобные вещи должны делатся именно в Idle. Если не работает, то можно в отладчике проверить работу функции wxAppBase::ProcessIdle(), которая вызывается при простоях. В результате этот код должен вызывать для всех окон метод wxWindow::OnInternalIdle()
yuri
Earned some good credits
Earned some good credits
Posts: 104
Joined: Thu Apr 09, 2009 4:58 pm
Location: Russia

Re: MainLoop с добавлениями

Post by yuri »

Kolya wrote:
sergiokey wrote:есть еще OnIdle но оно не подходит
Подобные вещи должны делатся именно в Idle. Если не работает, то можно в отладчике проверить работу функции wxAppBase::ProcessIdle(), которая вызывается при простоях. В результате этот код должен вызывать для всех окон метод wxWindow::OnInternalIdle()
idle совсем не есть панацея ибо требует чтобы приложение время от времени действительно стояло. К сожалению MainLoop в WX во-первых сильно зависит от платформы, а во вторых сильно непрост :( Кроме idle есть еще таймеры, тоже не панацея но ИМХО несколько надежнее.

Эта тема регулярно подымается потому что есть приложения где события WX хотелось бы обрабатывать если нет других занятий :) но сегодня архитектура WX этого делать не позволяет.
Kolya
Experienced Solver
Experienced Solver
Posts: 85
Joined: Mon Dec 11, 2006 11:35 am
Location: /dev/null

Re: MainLoop с добавлениями

Post by Kolya »

yuri wrote:idle совсем не есть панацея ибо требует чтобы приложение время от времени действительно стояло.
Кроме idle есть еще таймеры, тоже не панацея но ИМХО несколько надежнее.
Как и idle, так и таймер требуют, что бы главный поток приложения проставивал. К тому же если он не будет простаить (т.е. приложение заблокировано работой какой-либо функции), то пользователь будет думать что оно зависло.

Решать это можно при помощи потоков или обрабатывать события в алгоритме используя wxYield(). Но это уже сложнее и там есть свои проблемы.
yuri wrote:К сожалению MainLoop в WX во-первых сильно зависит от платформы, а во вторых сильно непрост :(
Я не замечал разную работу MainLoop на разных платформах. Специфическая реализация - да, она есть. Но как черный ящик MainLoop работал всегда одинаково у меня.
Сами исходники обработки событий занимают всего пару сотен строчек кода, и по сравнению с тысячами строк кода в других частях это не так уж много. Эти исходники сложны до тех пор, пока в них не покопатся :)
Вот только обработка событий управляет всем приложением, а это уже само по себе сложно.
yuri wrote: Эта тема регулярно подымается потому что есть приложения где события WX хотелось бы обрабатывать если нет других занятий :) но сегодня архитектура WX этого делать не позволяет.
Так для этого idle же и служит, но с ограничениями. Проблема синхронизации работы разных частей всегда будет стоять при разработке ПО, и дело здесь не в wx или операционной системе, а в самих алгоритмах.
yuri
Earned some good credits
Earned some good credits
Posts: 104
Joined: Thu Apr 09, 2009 4:58 pm
Location: Russia

Re: MainLoop с добавлениями

Post by yuri »

Kolya wrote: Как и idle, так и таймер требуют, что бы главный поток приложения проставивал. К тому же если он не будет простаить (т.е. приложение заблокировано работой какой-либо функции), то пользователь будет думать что оно зависло.
Нет. idle не будет генерироваться в проге которая непрерывно обрабатывает события, timer - события при этом генерироваться будут исправно.
Kolya wrote: Я не замечал разную работу MainLoop на разных платформах. Специфическая реализация - да, она есть. Но как черный ящик MainLoop работал всегда одинаково у меня.
Речь именно про реализацию и возможность модернизации: к примеру в Motif mainloop это цикл из 2х строчек - принять событие/обработать событие. Его легко модифицировать. MainLoop WX модифицировать нереально - мало того что на разных платформах он разный но и от релиза к релизу меняется
Kolya wrote: Так для этого idle же и служит, но с ограничениями. Проблема синхронизации работы разных частей всегда будет стоять при разработке ПО, и дело здесь не в wx или операционной системе, а в самих алгоритмах.
Сама идея idle не то чтобы порочна, она недостаточна, и это есть недостаток именно WX и его нынешней реализации mainloop. Реально бывает необходимо иметь более гибкий механизм управления обработкой событий, приоритетами событий и тп, но его нету и не предвидится.

Сегодня в wx есть два варианта - таймеры и onidle, плюс отдельные потоки. Ковырять mainloop _сегодня_ смысла нету. Собственно в этом и состояла моя мысль.
Post Reply