Спасибо, всем кто помог разобраться в прошлом вопросе, теперь созрел новый... возможно на него ответ известен давно в каком-нибудь паттерне, но я разобраться не смог, требуется наиболее красивое/изящное решение, итак к сути... чтобы предметно говорить приведу код, есть модуль A:
- Код: Выделить всё
unit A;
interface
Ta = class
public
procedure Work;
end;
implementation
procedure Ta.Work;
begin
while is_something_happened do;
end;
end.
и соответственно приложение
- Код: Выделить всё
Uses A;
var
myobject:Ta;
procedure myfunc();
begin
end;
begin
myobject:=ta.create;
while something do myobject.work;
myobject.free;
end.
Вопрос, собственно такой, в модуле A, где описан класс по is_something_happened проверяется наступление некого внешнего события (по ожиданию его прихода), которое гарантированно случиться, при этом пока происходит ожидание хотелось бы выполнять свою функцию myfunc из области видимости программы, в которой гарантированно не нагруженные функции (например Application.ProccessMessages, просчёт прогрессбара или что-то своего), как изящнее всего это сделать? мне в голову пришёл только вариант с указателем на процедуру, вот привожу пример рабочего кода, как я эту идею реализовал на простом примере:
- Код: Выделить всё
unit A;
interface
type
pfunc = procedure();
Ta = class
myfunc:pfunc;
constructor a(test:pfunc);
public
procedure Work;
end;
implementation
constructor Ta.a(test:pfunc);
begin
myfunc:=test;
end;
procedure Ta.Work;
begin
myfunc;
end;
-----------------------------------------
Uses A;
var
myobject:Ta;
tmp:byte=0;
procedure myfunc();
begin
inc(tmp);
writeln(tmp);
end;
begin
myobject:=ta.a(@myfunc);
while tmp<100 do myobject.work;
myobject.free;
Readln();
end.
конечно там стоит сделать проверку на nil, но можно ли это сделать как-то изящнее, например есть такое красивое слово как сопрограмма... использовать второй процесс, который усыплять или проверять по флагам состояния не хочется.