Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Помогите с функцией OnIdle


Автор: Kylinar 1.2.2008, 15:57
Народ помогите, бьюсь уже 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);
}
}
 

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

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

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

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

Теперь я так и сделал - все нормаьно работает... Обидно только, что не нашел причину подвисания...
С таймером тоже проблемки были: функцию SetTimer при отладке нормально проходил, а при запуске в эмуляторе - код ошибки деления на ноль??? Однако при использовании ::SetTimer(HWND,....) все работает как часики. 
 smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)