Вверх ↑
Ответов: 9906
Рейтинг: 351
#1: 2017-09-23 05:50:43 ЛС | профиль | цитата
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-овскую реализацию

Пожалуй, ДА.
Фактически одна задача решается тремя способами. Три сообщения, три обработчика...
Не то, чтобы это неправильно работало. Но - не по человечески как-то.
Ну и имеет такой стиль свое название - "индусский код".
Мне понятно, что Кладов неправильно код написал (универсальней надо).
Применять его код (вместо написания своего) - то еще удовольствие... Вопрос соотношения цены и получаемого результата
карма: 9

0
Редактировалось 4 раз(а), последний 2017-09-24 10:47:35