目录
在js的世界里,基本就是大量的“回调”和“异步”函数,剩下的就是按照顺序执行的javascript代码,所以总的来说,js中无“同步模型”。正是因为如此,javascript在运行时没有“多余的”线程,它们都在同一个“线程”中工作。
比如,任何第三方平台,凡是其API-Proxy代理服务器向你“代理转发(重定向)URL”,其响应结果,要么你在浏览器的导航器的地址栏中去取(Navigator.Location),要么你在响应头的redirect参数中去取,它们,都是异步的。
Delphi及C++ Builder中,可以在发http请求时,传入一个“泛型的匿名方法”或“匿名的事件处理函数”的回调方法,在线程的“同步函数”中,调用该“回调”方法。得到“异步请求”的结果,并用此回调方法对该结果进行处理。
Delphi及C++ Builder的世界里,有太多太多的处理机制,底层的构造,罗列如下,以期在不同的应用场景,进行灵活使用:
通用的匿名方法的定义描述类型:
// Generic Anonymous method declarations
type// 匿名方法:
TProc = reference to procedure;
TProc= reference to procedure (Arg1: T);
TProc= reference to procedure (Arg1: T1; Arg2: T2);
TProc= reference to procedure (Arg1: T1; Arg2: T2; Arg3: T3);
TProc= reference to procedure (Arg1: T1; Arg2: T2; Arg3: T3; Arg4: T4); // 匿名函数:
TFunc
= reference to function: TResult;
TFunc= reference to function (Arg1: T): TResult;
TFunc= reference to function (Arg1: T1; Arg2: T2): TResult;
TFunc= reference to function (Arg1: T1; Arg2: T2; Arg3: T3): TResult;
TFunc= reference to function (Arg1: T1; Arg2: T2; Arg3: T3; Arg4: T4): TResult; // 匿名断言:
TPredicate
= reference to function (Arg1: T): Boolean;
通用方法指针:
/* Generic procedure pointer */
TProcedure = procedure;
标准事件类型:
/* Standard events */
type
TNotifyEvent = procedure(Sender: TObject) of object;
TGetStrProc = procedure(const S: string) of object;
我加的,自定义事件类型的描述模型:
TCustomizeEvent = procedure(const aString:string; aClassObject:TObject) of Object;
// 比如,线程类中的带类事件标识字符串、类的参数的事件类型
// 另:除这两个参数以外,还可以有N个泛型参数
带线程(线程ID、事件或强制队列处理、线程方法及过程)的匿名方法:
TOnSynchronizeProc = reference to procedure (AThreadID: TThreadID; var AQueueEvent: Boolean; var AForceQueue: Boolean; var AMethod: TThreadMethod; var AProcedure: TThreadProcedure);
线程结构体(记录)及其指针的描述模型:
type
PSynchronizeRecord = ^TSynchronizeRecord;
TSynchronizeRecord = record
FThread: TObject;
FMethod: TThreadMethod;
FProcedure: TThreadProcedure;
FSynchronizeException: TObject;
FExecuteAfterTimestamp: Int64;
procedure Init(AThread: TObject; const AMethod: TThreadMethod); overload;
procedure Init(AThread: TObject; const AProcedure: TThreadProcedure); overload;
end;
任意线程(包括主线程、子线程、嵌套的线程)或类的方法:
/* TThread */
线程或类的匿名(的隐形)事件:
TThreadMethod = procedure of object; // 隐式地包含了aClassObject:TObject事件参数
线程中的匿名方法或类中的匿名方法(的指针):
TThreadProcedure = reference to procedure;
方法类型的通用指针记录(以指针为字段的结构体)及其指针:
PMethod = ^TMethod;
TMethod = record
Code, Data: Pointer;
public
class operator Equal(const Left, Right: TMethod): Boolean; inline;
class operator NotEqual(const Left, Right: TMethod): Boolean; inline;
class operator GreaterThan(const Left, Right: TMethod): Boolean; inline;
class operator GreaterThanOrEqual(const Left, Right: TMethod): Boolean; inline;
class operator LessThan(const Left, Right: TMethod): Boolean; inline;
class operator LessThanOrEqual(const Left, Right: TMethod): Boolean; inline;
end;
泛型的动态数组 :
TArray
= array of T;
枚举及泛型枚举接口及其泛型比较接口的描述模型:
IEnumerator = interface(IInterface)
function GetCurrent: TObject;
function MoveNext: Boolean;
procedure Reset;
property Current: TObject read GetCurrent;
end;IEnumerable = interface(IInterface)
function GetEnumerator: IEnumerator;
end;IEnumerator
= interface(IEnumerator)
[HPPGEN('virtual T __fastcall GetCurrentT(void) = 0')]
function GetCurrent: T;
[HPPGEN('__property T Current = {read=GetCurrentT}')]
property Current: T read GetCurrent;
end;IEnumerable
= interface(IEnumerable)
[HPPGEN('virtual System::DelphiInterface> __fastcall GetEnumeratorT(void) = 0')]
function GetEnumerator: IEnumerator;
end;IComparable = interface(IInterface)
function CompareTo(Obj: TObject): Integer;
end;IComparable
= interface(IComparable)
function CompareTo(Value: T): Integer;
end;IEquatable
= interface(IInterface)
function Equals(Value: T): Boolean;
end;
New一个任意(结构体的)指针:
var
SyncProc: TSyncProc; // : record
SyncProcPtr: PSyncProc; // : ^SyncProcNew(SyncProcPtr)
1.《软件的基本是要处理好”算法“及其基础(一)流-字-字符(包括某个数字、字母、符号和某个汉字等)-字符串-字节动态数组-字节-整数之间的转化关系和算法》
2.《软件的基本是要处理好”算法“及其基础(二)delphi系统原子函数及方法》
3.《软件的基本是要处理好”算法“及其基础(三)delphi 10.4.1字符串工具单元及其函数》
4.《时间、计时相关方法之 -软件的基本是要处理好”算法“及其基础(四)》
5、《delphi异步与javascript》