nesco писал(а):
Интересно бы глянуть на пример реализации DeferredEvent по этому принципуНу например:
unit hiSynchronize;
interface
uses Windows,Kol,Share,Debug;
type
ThiSynchronize = class(TDebug)
private
PT:integer; // Адрес фиктивного потока TThread
TM:TThreadMethod; // Реальное поле FMethod фиктивного потока TThread
DT:TData;
procedure SyncMethod;
public
_data_DataBefore:THI_Event;
_data_DataAfter:THI_Event;
_event_onSync:THI_Event;
constructor Create;
procedure _work_doSynchronize(var _Data: TData; Index: Word);
procedure _work_doDeferred(var _Data: TData; Index: Word);
end;
implementation
type
{$ifndef F_P}
TThreadEx = object(TThread) end;
PThreadEx = ^TThreadEx;
{$else}
TThreadEx = class(TThread) end;
PThreadEx = TThreadEx;
{$endif}
var Dummy:TThreadMethod;
constructor ThiSynchronize.Create;
begin
inherited;
PT := integer(@@TM)-integer(@@PThreadEx(nil).FMethod);
TM := SyncMethod;
end;
procedure ThiSynchronize._work_doSynchronize(var _Data: TData; Index: Word);
begin
DT := ReadData(_Data, _data_DataBefore);
SendMessage(Applet.Handle, CM_EXECPROC, 0, PT);
end;
procedure ThiSynchronize._work_doDeferred(var _Data: TData; Index: Word);
begin
DT := ReadData(_Data, _data_DataBefore);
PostMessage(Applet.Handle, CM_EXECPROC, 0, PT);
end;
procedure ThiSynchronize.SyncMethod;
var D:TData;
begin
D := ReadData(DT, _data_DataAfter);
_hi_OnEvent(_event_onSync, D);
end;
Initialization
PThread(integer(@@Dummy)-integer(@@PThreadEx(nil).FMethod)).Synchronize(Dummy);
end.
Netspirit писал(а):
не дублировать KOL-овскую реализациюПожалуй, ДА.
Фактически одна задача решается тремя способами. Три сообщения, три обработчика...
Не то, чтобы это неправильно работало. Но - не по человечески как-то.
Ну и имеет такой стиль свое название - "индусский код".
Мне понятно, что Кладов неправильно код написал (универсальней надо).
Применять его код (вместо написания своего) - то еще удовольствие... Вопрос соотношения цены и получаемого результата