mainloop - как использовать?
-
- Earned some good credits
- Posts: 127
- Joined: Tue Mar 24, 2009 10:21 am
- Contact:
mainloop - как использовать?
Всем привет!
Написал приложение (клеточный автомат), которое использует таймер. Но таймер не так быстр и для значительного ускорения процессов уже не подходит. Мне посоветовали использовать mainloop, но как это сделать? Мне нужно взаимодействие с компонентами формы. Если вызывать что-то из OnInit или OnIdle, компоненты в тот момент ещё не созданы и компилятор ругается, что не знает их. А как тогда делать?
Написал приложение (клеточный автомат), которое использует таймер. Но таймер не так быстр и для значительного ускорения процессов уже не подходит. Мне посоветовали использовать mainloop, но как это сделать? Мне нужно взаимодействие с компонентами формы. Если вызывать что-то из OnInit или OnIdle, компоненты в тот момент ещё не созданы и компилятор ругается, что не знает их. А как тогда делать?
Если скорости таймера не хватает (?!?), то наверное стоит использовать OnIdle.
Взаимосвязи между тем что компоненты еще не созданы (runtime) и ругается компилятор (compile time) в упор не вижу:) Ошибка где-то в другом месте...
Взаимосвязи между тем что компоненты еще не созданы (runtime) и ругается компилятор (compile time) в упор не вижу:) Ошибка где-то в другом месте...
Best regards, Nikolay
wxWidgets in russian
Small Notes Manager and Clipboard Manager with History written with wxWidgets
wxWidgets in russian
Small Notes Manager and Clipboard Manager with History written with wxWidgets
-
- Earned some good credits
- Posts: 127
- Joined: Tue Mar 24, 2009 10:21 am
- Contact:
Ну, может быть и в другом. А не можете вкратце рассказать, как этот mainloop вызывать? Вот я создал проект в wxDev-C++ и теперь хочу в mainloop или OnIdle запихнуть вызов какой-нить функции. Куда что писать? Я пробовал экспериментировать с OnRun или OnIdle, но ничего не получалось - или компилятор говорил что не знает мою форму, либо просто ничего не происходило.
Ну давай по шагам, ты можешь написать обработчик некоего события например wxIdleEvent или wxCloseEvent?
Поставить внутри брейк поинт или wxLogDebug(_T("something")) и убедится что туда заходит?
И не забудь про RequestMore для OnIdle.
И повторюсь, имхо тебе не надо не OnIdle не main loop. Расскажи чем тебя таймер не устраивает и что ты хочешь сделать?
Поставить внутри брейк поинт или wxLogDebug(_T("something")) и убедится что туда заходит?
И не забудь про RequestMore для OnIdle.
И повторюсь, имхо тебе не надо не OnIdle не main loop. Расскажи чем тебя таймер не устраивает и что ты хочешь сделать?
Best regards, Nikolay
wxWidgets in russian
Small Notes Manager and Clipboard Manager with History written with wxWidgets
wxWidgets in russian
Small Notes Manager and Clipboard Manager with History written with wxWidgets
-
- Earned some good credits
- Posts: 127
- Joined: Tue Mar 24, 2009 10:21 am
- Contact:
Да, я написал обработчик OnIdle, но вызвать оттуда функцию не могу - даже просто обратиться к форме не могу, потому что компилятор говорит - а это не декларировано.
В англоязычном форуме я уже попросил помощи, уже несколько дней мне подсказывают то одно, то другое, но пока результата нет. Вот тема (чтобы не повторять одно и то же): http://forums.wxwidgets.org/viewtopic.php?t=24406
Программа, которую я делаю, лежит тут: http://www.cathyportal.ru/files/Cycles.zip
Попробуй там поставить несколько элементов рядом (кликая на таблицу) и посмотреть, что будет происходить. Надо подождать, там как бы "заряжается" вакуум.
Проблема в том, что я не могу ускорить процесс. Таймер быстрее просто не работает. У меня интервал стоит на 10 мс и быстрее он уже не может. Соответственно, ускорить программу не получается, а так ждать слишком долго пока всё происходит, иногда хочется ускорить.
В англоязычном форуме я уже попросил помощи, уже несколько дней мне подсказывают то одно, то другое, но пока результата нет. Вот тема (чтобы не повторять одно и то же): http://forums.wxwidgets.org/viewtopic.php?t=24406
Программа, которую я делаю, лежит тут: http://www.cathyportal.ru/files/Cycles.zip
Попробуй там поставить несколько элементов рядом (кликая на таблицу) и посмотреть, что будет происходить. Надо подождать, там как бы "заряжается" вакуум.
Проблема в том, что я не могу ускорить процесс. Таймер быстрее просто не работает. У меня интервал стоит на 10 мс и быстрее он уже не может. Соответственно, ускорить программу не получается, а так ждать слишком долго пока всё происходит, иногда хочется ускорить.
Ну, я вижу что в англоязычном форуме тебе говорили, что вместо
надо писать
А после этого ты приводишь свой код в котором TablesFrmApp:: отсутствует, а ошибка то тут..
И еще по поводу таймера что там такое делается что 100 раз в секунду сильно редко?
Может тогда стоит вместо
Писать
??
Code: Select all
void OnIdle(wxIdleEvent& event){
frame->GetNum();
}
Code: Select all
void TablesFrmApp::OnIdle(wxIdleEvent& event){
frame->GetNum();
}
И еще по поводу таймера что там такое делается что 100 раз в секунду сильно редко?
Может тогда стоит вместо
Code: Select all
... OnTimer(wxTimerEvent & event)
{
SomeWork();
}
Code: Select all
... OnTimer(wxTimerEvent & event)
{
for(int t = 0; t < 100; ++t)
SomeWork();
}
Best regards, Nikolay
wxWidgets in russian
Small Notes Manager and Clipboard Manager with History written with wxWidgets
wxWidgets in russian
Small Notes Manager and Clipboard Manager with History written with wxWidgets
-
- Earned some good credits
- Posts: 127
- Joined: Tue Mar 24, 2009 10:21 am
- Contact:
Ыыыы... а этого я и не заметил. Просматривал код, а этой детали не заметил. Попробую с ней.
Ну а насчёт таймера - по таймеру создаётся случайная координата x и y и затем вызывается wxGrid1->SelectCell(y,x). Функция события OnCellSelect содержит основные вычисления.
Вот мне бы хотелось чтобы это быстрее было - чтобы чаще вызывалось wxGrid1->SelectCell(y,x).
Ну а насчёт таймера - по таймеру создаётся случайная координата x и y и затем вызывается wxGrid1->SelectCell(y,x). Функция события OnCellSelect содержит основные вычисления.
Вот мне бы хотелось чтобы это быстрее было - чтобы чаще вызывалось wxGrid1->SelectCell(y,x).
-
- Earned some good credits
- Posts: 127
- Joined: Tue Mar 24, 2009 10:21 am
- Contact:
Ребят, я не знаю. Я не очень сильный программист. Конечно, я с радостью учусь новому и разбираться с wxWidgets мне нравится, но пока я многого не понимаю. Но я точно знаю, что ускорить мою программу можно - там очень простые вычисления и компьютер способен во много раз ускорить процесс.
В таймере я выставил очень маленький интервал, но процесс не ускоряется достаточно.
В таймере я выставил очень маленький интервал, но процесс не ускоряется достаточно.
Значит надо искать где грабли...
wxLogDebug(..) в таймере до и после вызова твоей функции, и выводи время, а потом уже смотри где все тормозится.
wxLogDebug(..) в таймере до и после вызова твоей функции, и выводи время, а потом уже смотри где все тормозится.
Best regards, Nikolay
wxWidgets in russian
Small Notes Manager and Clipboard Manager with History written with wxWidgets
wxWidgets in russian
Small Notes Manager and Clipboard Manager with History written with wxWidgets
-
- Earned some good credits
- Posts: 127
- Joined: Tue Mar 24, 2009 10:21 am
- Contact:
Да конечно, код могу показать. могу файл куда-нить закачать.
Таймер запускается, когда в меню пользователь нажимает Start. Тогда случается WxTimer1->Start(1,false);
В функции OnTimer производится вызов WxGrid1->SelectCell(y,x);
А далее в функции OnSelectCell производятся "вычисления" - то есть, в зависимости от значения окружающих ячеек в данную ячейку ставится то или иное значение.
Я вижу что бегунок бегает по таблице очень шустро - за секунду думаю раз десять пробегает. Я читал, что компонент Таймер не может иметь интервал меньше 10мс и что для увеличения скорости выполнения нужно отходить от таймера и вместо этого использовать mainloop, благодаря чему можно в секунду тысячи раз пробегать по таблице.
То есть у меня нет ощущения что что-то тормозится - таймер просто не настолько быстр.
Таймер запускается, когда в меню пользователь нажимает Start. Тогда случается WxTimer1->Start(1,false);
В функции OnTimer производится вызов WxGrid1->SelectCell(y,x);
А далее в функции OnSelectCell производятся "вычисления" - то есть, в зависимости от значения окружающих ячеек в данную ячейку ставится то или иное значение.
Я вижу что бегунок бегает по таблице очень шустро - за секунду думаю раз десять пробегает. Я читал, что компонент Таймер не может иметь интервал меньше 10мс и что для увеличения скорости выполнения нужно отходить от таймера и вместо этого использовать mainloop, благодаря чему можно в секунду тысячи раз пробегать по таблице.
То есть у меня нет ощущения что что-то тормозится - таймер просто не настолько быстр.
А я уже предлагал в таймере больше чем 1 раз пробегать по таблице?:)
Best regards, Nikolay
wxWidgets in russian
Small Notes Manager and Clipboard Manager with History written with wxWidgets
wxWidgets in russian
Small Notes Manager and Clipboard Manager with History written with wxWidgets
-
- Earned some good credits
- Posts: 127
- Joined: Tue Mar 24, 2009 10:21 am
- Contact:
-
- Super wx Problem Solver
- Posts: 362
- Joined: Wed Mar 07, 2007 8:10 am
- Location: Russia, Shakhty
Вот что мне говорит справкаЯ читал, что компонент Таймер не может иметь интервал меньше 10мс и что для увеличения скорости выполнения нужно отходить от таймера и вместо этого использовать mainloop
Разбери у wxTimer Start.wxTimer
The wxTimer class allows you to execute code at specified intervals. Its precision is platform-dependent, but in general will not be better than 1ms nor worse than 1s.
Похоже про миллисекунды это твое субъективное мнение. Если тебя интересует реакция интерфейса на что-то то лучше всего привязывать это события к5 событиям (прости за тавтологию - Event'ам)