setwaitabletimer



Автор Мирослав Воеводин задал вопрос в разделе Другие языки и технологии

Delphi!? Напишите самы простой пример указателя на функцию и как его задействовать? и получил лучший ответ

Ответ от Ru-admin[гуру]
Передаем указатель на функцию Delphi
==================================================
BOOL SetWaitableTimer(
HANDLE hTimer,
const LARGE_INTEGER* pDueTime,
LONG lPeriod,
PTIMERAPCROUTINE pfnCompletionRoutine,
LPVOID lpArgToCompletionRoutine,
BOOL fResume
);
-----------------------------------------------------------------------
procedure {void} TimerAPCProc(
lpArgToCompletionRoutine:pointer;
dwTimerLowValue:DWORD;
dwTimerHighValue:DWORD
); stdcall {так определен CALLBACK};
------------------------------------------------------------------------
procedure TimerAPCProc(param: Pointer; dwTimerLowValue, dwTimerHighValue: DWORD);stdcall;
begin
ShowMessage( Format( 'Timer %p: %d %d',
[param, dwTimerLowValue, dwTimerHighValue]));
end;
procedure TForm1.Button1Click(Sender: TObject);
var
HTimer: THandle;
DueTime: Int64;
begin
HTimer := CreateWaitableTimer(nil, False, nil);
if HTimer <> 0 then
begin
DueTime := -20000000; // 2 сек
if SetWaitableTimer( HTimer,
DueTime,
0, // единожды
@TimerAPCProc,
Pointer(HTimer), // указатель на параметры
False) then
SleepEx(INFINITE, True);
CloseHandle(HTimer);
end;
end;
--------------------------------------------------

Ответ от Йа НяшкО XD[гуру]
type Tmyfunc = function(a: Double; b: Double): Double; // чтобы он знал, какие функция принимает аргументы и что возвращает.
// разные варианты функций
function CalcAdd(a: Double; b: Double): Double;
begin
Result := a + b;
end;
function CalcMul(a: Double; b: Double): Double;
begin
Result := a * b;
end;
// а здесь результат зависит от функции, которую мы передадим - там может быть любая мыслимая функция двух аргументов
function Calc(func: Tmyfunc): Double;
begin
Result := func(2, 5);
end;
...
Double nyaAdd, nyaMul;
nyaAdd := Calc(CalcAdd);
nyaMul := Calc(CalcMul);
// не помню тока, надо ли здесь подставлять знак операции "взятие адреса" & или компилятор сам догадается
Основной профит - можно передавать оговорённую функцию или процедуру любой dll (она запомнит адрес функции, например, и при каком-то событии вызовет её с определёнными аргументами, не доступными извне этой dll). В winApi это широко используется в виде callback-функций - функций, которые вызываются при наступлении определённых событий: таймер тикнул или передаётся очередной объект при перечислении окон, или ещё чего...

Ответ от 22 ответа[гуру]
Привет! Вот подборка тем с похожими вопросами и ответами на Ваш вопрос: Delphi!? Напишите самы простой пример указателя на функцию и как его задействовать?
 

Ответить на вопрос:

Имя*

E-mail:*

Текст ответа:*
Проверочный код(введите 22):*