Xt предоставляет приложению возможность выполнять определенные действия через заданные промежутки времени. Например, периодически отображать на экране текущее время в заданном окне и т.д. Для указанных целей используется специальный механизм Xt - таймер. Он обеспечивает вызов через заданный интервал времени специальной функции, заданной программой. Таймер создается, например процедурой
XtIntervalId XtAppAddTimeOut (XtAppContext prAppContext,
unsigned long nInterval, XtTimerCallbackProc pProcedure,
XtPointer pUserData);
|
Здесь первый аргумент задает, как обычно, контекст программы. Второй аргумент определяет время задержки в миллисекундах, т.е. временной интервал, по истечении которого - будет вызываться функция (таймер-процедура), заданная третьим аргументом данной процедуры. Используя четвертый аргумент, можно передать в вызываемую функцию произвольные данные.
Процедура возвращает значение типа XtIntervalId, которое однозначно идентифицирует зарегистрированный таймер и которое затем может быть использовано в качестве аргумента в процедуре XtRemoveTimeOut (XtIntervalId), предназначенной для уничтожения таймера.
Регистрируемая функция, должна иметь следующий прототип:
void TimerProc (XtPointer pUserData, XtIntervalId *Id);
|
Здесь pUserData - это указатель на данные, определенные четвертым параметром в вызове процедуры XtAppAddTimeOut( ). Второй аргумент - это указатель на идентификатор таймера.
Отметим, что таймер автоматически уничтожается при вызове соответствующей процедуры. Поэтому, если необходимо, чтобы таймер функционировал н периодически проявлял себя каждые nInterval миллисекунд, в вызываемой функции он должен пересоздаваться с помощью XtAppAddTimeOut( ).
Таймер может быть создан и зарегистрирован с помощью процедуры XtAddTimeOut( ), которая отличается от описанной выше функции XtAppAddTimeOut( ) только отсутствием аргумента prAppContext.
Ниже приведен фрагмент кода, содержащий пример использования таймера.
void Count (Widget prWidget, XtIntervalId *Id)
{
static int n = 0;
if (n<10) {
XtAppAddTimeOut(XtWidgetToApplicationContext (prWidget),
1000, Count, prWidget);
n++;
printf ("%d seconds.\n", n);
}
else
exit(0);
}
void main (int argc, char **argv)
{
XtAppContext prAppContext;
Widget prTopLevelWidget;
int nId;
prTopLevelWidget = XtVaAppInitialize (&prAppContext,
"Timer", NULL, 0,
&argc, argv, NULL, NULL);
XtAppAddTimeOut(prAppContext, 1000, Count,
prTopLevelWidget);
XtRealizeWidget(prTopLevelWidget);
XtAppMainLoop(prAppContext);
}
|
В данном случае таймер работает, как секундомер, отсчитывая десять секунд, после чего программа завершается.
Мы использовали в приведенном фрагменте кода удобную процедуру XtWidgetToApplicationContext( ), которая по данному widget возвращает контекст программы.