我的step 方法
if (b is TComponentThread) then
(b as TComponentThread).ProcessEvents
else
if (b is TConnectorThread) then
(b as TConnectorThread).ProcessEvents
else
begin
// unknown brick type
end;
我在TConnectorThread, TComponentThread 类中维护了一个Fifo消息队列TPortList,
其中ProcessEvents 方法可能会处理消息队列中的消息,这个消息也是我自己定义
的类TMessage , TRequest, TNotification,
ProcessEvents 的方法如下,
var
r : TRequest;
n : TNotification;
begin
r := (bottom.SelectNextIncomingMessage) as TRequest;
if (r <> Nil) then
Handle_r(r);
n := (top.SelectNextIncomingMessage) as TNotification;
if (n <> Nil) then
Handle_n
;
Result := (r <> Nil) or (n <> Nil);
在Handle_r, Handle_n 方法中可能会生成或者删除某个页面,
或者给页面添加某个VCL组件,
我现在的Thread.Execute 的方法是
if Assigned(b) then
begin
while not Terminateddo
begin
try
// Synchronize(Step);
Application.ProcessMessages;
Step;
except
On E : Exceptiondo
raise EThreadException.Create('Current Thread is Error');
end;
SemaphoreGet;
end;
end;