Вверх ↑
Ответов: 9906
Рейтинг: 351
#1: 2017-09-30 22:15:13 ЛС | профиль | цитата
nesco писал(а):
Может действительно закопать

Видишь ли, nesco, я сторонник эффективного минимализма...
Но, конечно же - ни на чем не настаиваю. Просто излагаю мысли, вытекающие из этого "минимализма".

И если закапывать все по максимуму, то получится примерно один элемент. Являющийся небольшим расширением элемента Netspirit-а.
Верхних точек на одну больше стало... От того, что при "отложенности" надо читать ДО, в то время, как при "синхронизации" надо ПОСЛЕ - никуда как бы и не денешься.
Теоретически, можно бы и эту точку выкинуть, но это уже противоречит эффективности. Много суеты ради неубедительного результата
Примерно такая доработка, без потери совместимости

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_inData:THI_Event;
_data_Data:THI_Event;
_event_onSync:THI_Event;
constructor Create;
procedure _work_doSynchronize(var _Data: TData; Index: Word);
end;

implementation

type
{$ifdef F_P FreePascal}
TThreadEx = class(TThread) end;
PThreadEx = TThreadEx;
var MainThreadID:dword;
{$else Delphi}
TThreadEx = object(TThread) end;
PThreadEx = ^TThreadEx;
{$endif}

constructor ThiSynchronize.Create;
begin
PT := integer(@@TM)-integer(@@PThreadEx(nil).FMethod);
TM := SyncMethod;
end;

procedure ThiSynchronize._work_doSynchronize(var _Data: TData; Index: Word);
type F = procedure(hWnd, Msg, wParam, lParam:dword); stdcall;
var FP:pointer;
begin
DT := ReadData(_Data, _data_inData);
FP := @SendMessage; // Вариант вызова из параллельного потока
if GetCurrentThreadID = MainThreadID then // - из главного потока
FP := @PostMessage;
F(FP)(Applet.Handle, CM_EXECPROC, 0, PT);
end;

procedure ThiSynchronize.SyncMethod;
var D:TData;
begin
D := ReadData(DT, _data_Data);
_hi_OnEvent(_event_onSync, D);
end;

var Dummy:TThreadMethod;
Initialization
{$ifdef F_P FreePascal}MainThreadID := GetCurrentThreadID;{$endif}
PThread(integer(@@Dummy)-integer(@@PThreadEx(nil).FMethod)).Synchronize(Dummy);
end.
карма: 9

0
Редактировалось 1 раз(а), последний 2017-09-30 22:17:28