Входно изходен интерфейс.Таймер
| Информационни технологии | 2009-12-04 | 69 сваляния |
16 Вх./изх. интерфейс.Таймер.Call-back ф-ии. Прихващане на ф-ии в Windows
Таймер
Софтуерен таймер-периодично чрез отлагане на съобщения информира, че е изминал определен времеви интервал. При програми, които по някъкъв начин са свързани с време; в програми които периодично правят определени измервания на началната памет в компютъра; при много задания, работа, когато програмата освобождава ресурсите и да ги предоставим на други; при програми, които автоматично апериодично съхраняват данни при операции.
Ето един фрагмент от програма, дефиниращ 2 таймера:
#define TIMER_SEC 1
#define TIMER_MIN 2
.....
SetTimer(hwnd, TIMER_SEC, 1000, NULL);
SetTimer(hwnd, TIMER_MIN, 60000,NULL);
....
case WM_TIMER :
switch(wParam) / /съдържа идентификатор на таймер
{case TIMER_SEC : // обработка веднаж в секунда;
break;
case TIMER_MIN : // обработка веднаж в минута;
break;
......
CALL-BACK функции
Това е функция предназначена да се вика през ОС на която може да се предават определени аргументи.Викането не става явно.Те позволяват:
-
свързване с прозорец
-
да приемат за обработка съобщения
-
функционално модифицирана обикновено стандартна Арр функция
-
позволява както ние да подадем параметри, така и Windows като мине през него да допълни със стойности параметри.
Списъка на Call-back функцията е фиксиран.
Пр.1
WORD FAR PASCAL TimerProc(HWND hwnd, WORD message,WORD wParam,LONG lParam)
{//отработване на съобщенията от таймера; return 0; }
EXPORT xxxxx
TimerProc
FARPROC lpfnTimerProc; // декларация на дълъг указател
......
lpfnTimerProc = MakeProcInstance (TimerProc, hInstance);
.....
SetTimer(hwnd,1, Interval, lpfnTimerProc);
Този пример прави следното - създава в паметта служебна структура, шлюз през който задължително минава всяко извикване на тази функция, а служебна защото се изпълнява от Win. Всяка Win програма взема съдържанието на ахи го поставя като даннов сегмент.Ако не изработим по този начин адреса извикването на TimerProc ще се намери (кода), но данните - не . Когато Windows размества код и данни в паметта, той има грижата да ги премести в шлюза. Мястото на данни и код е променливо за това понятието на адреса губи смисъл, но за нас адреса е постоянен, защото ние го вземаме от шлюза.
Таймери в 32 битови среди
CWnd:: SetTimer() CWnd::KillTimer();
MFC макросът ON_WM_TIMER насочва WM_TIMER към CMainWindows::OnTimer(UINT nTimerID);
Обработката на таймер със съобщения става по 2 начина:
-
Чрез свързване към съобщението и той се връща до пр.1.
-
Чрез свързване с Call-back функция
Таймерското съобщение е ниско приоритетно, т.е ако getmessаge изтегли всички съобщения от опашката тогава ще провери дали е вдигнат флага от таймера. Тогава то се изтегля от getmеssаge а Dispatch message проверява има ли Call-back функция. Ако има подава на нея съобщение, а ако няма се свързва с PROC функцията, която е обща за всички.
1. Приложението с таймер би трябвало да изглежда така:
BEGIN_MESSAGE_MAP ( CMainwindow, CFrameWindow)
ON_WM_CREATE()
ON_WM_TIMER()
END_MESSAGE_MAP
int CMainWindow::OnCreate()
{if(!SetTimer(ID_TIMER_XX,100,NULL)) {..} return 0;}
void CMainWindow::PnTimer(UINT nTimerID)
{ // например изрисува нещо през 100 мс }
2.Ако искаме да свържем таймера с callback ф-ия:
SetTimer( ID_TIMER, 100, TimerProc); ..
void CALLBACK TimerProc( HWND hWnd, UINT nMsg, UINT nTimerID, DWORD dwTime )
Всяка Call-back функция трябва да е или глобална или статична. Глобална да не е метод на никакъв клас. За да е описана в клас трябва да е статична. Call-back функциите са статични, защото списъка с параметрите е фиксиран. Много от Call-back
Тагове от реферата: съобения, софуерен, прихне, информира, периодично, интерф, Windows











