Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите с функцией OnIdle, моя писанина зависает 
V
    Опции темы
Kylinar
Дата 1.2.2008, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 1.2.2008

Репутация: нет
Всего: нет



Народ помогите, бьюсь уже 2-й день с какой-то чепухой, дело в том, что пишу програмку на контроллер WinCon в eVC++ 4 SADU_SACR SDK, до специфичных ему функций дело еще не дошло и поэтому тестирую в на стандартном эмуляторе. 
Дело в том, что решил сделать таймер внизу экрана с помощью функции OnIdle, все работает пока не нажмешь на какую либо кнопку меню. Как только нажимаю все виснет, причем не всегда. Отладчик тормозной очень не смог с его помощью ничего найти...

Вот мои функции:

Код

BOOL CZadatchikApp::OnIdle(LONG lCount) 
{
// TODO: Add your specialized code here and/or call the base class
if(this->Timer==0)//это переменная изменяется совсем не тут
{
BOOL bMore = CWinApp::OnIdle(lCount);
if (m_pMainWnd)
if(lCount)
{
((CMainFrame *)m_pMainWnd)->RedrawTime(); 
bMore = TRUE;
}
return bMore;
}
else
{
BOOL bMore = CWinApp::OnIdle(lCount);
return bMore;
}
}


void CMainFrame::RedrawTime()
{

CZadatchikView* pView;
pView = (CZadatchikView*)this->GetActiveView();
if(pView==NULL)return; //на всякий случай
if(pView->GetDC()!=NULL) //еще раз
pView->GetDocument()->CMy_Point_Struct.RedrawTime(pView->GetDC());

}

CPoint_Struct::RedrawTime(CDC* PDC)
{
if(VisibleTime)
{

CTime tmCurrent = CTime::GetCurrentTime();
int Year = tmCurrent.GetYear();
int Month = tmCurrent.GetMonth();
int Day = tmCurrent.GetDay();
int Hour = tmCurrent.GetHour();
int Minute = tmCurrent.GetMinute();
int Second = tmCurrent.GetSecond();
int Height = Rect_W.Height()-10;
int Weight = Rect_W.Width() -10;
CString Time;
char Buff_Time[40];
for(int t=0;t<40;t++)Buff_Time[t]='\0';
_itoa(Year,Buff_Time,10);
Time = Buff_Time;
Time +='.';
for(t=0;t<40;t++)Buff_Time[t]='\0';
_itoa(Month,Buff_Time,10);
Time +=Buff_Time;
Time +='.';
for(t=0;t<40;t++)Buff_Time[t]='\0';
_itoa(Day,Buff_Time,10);
Time +=Buff_Time;
Time +=' ';
for(t=0;t<40;t++)Buff_Time[t]='\0';
_itoa(Hour,Buff_Time,10);
Time +=Buff_Time;
Time +=':';
for(t=0;t<40;t++)Buff_Time[t]='\0';
_itoa(Minute,Buff_Time,10);
Time +=Buff_Time;
Time +=':';
for(t=0;t<40;t++)Buff_Time[t]='\0';
_itoa(Second,Buff_Time,10);
Time +=Buff_Time;
PDC->SetTextColor(RGB(50,50,50));
PDC->ExtTextOut(Weight-110,Height-10,NULL,&Rect_W,Time,NULL);
}
}
 

Заранее благодарен. 

Это сообщение отредактировал(а) Kylinar - 1.2.2008, 17:40
PM MAIL   Вверх
JackYF
Дата 1.2.2008, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: нет
Всего: 162



Kylinar, пользуйся кнопкой "Код" и отступами в коде. А также константами.
К примеру, что такое "40", которое встречается в куче мест кода, абсолютно не понятно.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Earnest
Дата 1.2.2008, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



А почему таймер нужно делать на Idle? Не очень хорошая идея: Idle приходит только после сообщений, т.е. если никто ничего - твой таймер будет стоять... Почему бы таймер не повесить на WM_TIMER?
Кроме того, рисовать где ни попадя - тоже плохая идея. Рисовать нужно исключительно на WM_PAINT, а в остальных местах - просто сообщать, что хочешь перерисоваться, т.е. делать Invalidate. 
Если ты вешаешь все на Idle из тех соображений, чтобы не отнимать ресурсы у более важных функций, так можешь не заморачиваться - у таймера и WM_PAINT и так самый низкий приоритет.


--------------------
...
PM   Вверх
Kylinar
Дата 2.2.2008, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 1.2.2008

Репутация: нет
Всего: нет



Цитата(Earnest @ 1.2.2008,  18:40)
А почему таймер нужно делать на Idle? Не очень хорошая идея: Idle приходит только после сообщений, т.е. если никто ничего - твой таймер будет стоять... Почему бы таймер не повесить на WM_TIMER?
Кроме того, рисовать где ни попадя - тоже плохая идея. Рисовать нужно исключительно на WM_PAINT, а в остальных местах - просто сообщать, что хочешь перерисоваться, т.е. делать Invalidate. 
Если ты вешаешь все на Idle из тех соображений, чтобы не отнимать ресурсы у более важных функций, так можешь не заморачиваться - у таймера и WM_PAINT и так самый низкий приоритет.

Теперь я так и сделал - все нормаьно работает... Обидно только, что не нашел причину подвисания...
С таймером тоже проблемки были: функцию SetTimer при отладке нормально проходил, а при запуске в эмуляторе - код ошибки деления на ноль??? Однако при использовании ::SetTimer(HWND,....) все работает как часики. 
 smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.1117 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.