如果您想多投入一点,而不是一个简单的 Synchronize 调用,顺便阻塞主线程,您可以添加一个简单的 FIFO 队列,上面有消息传递。数据流是这样的:
- 线程将数据放入队列。
- 该线程将消息发布到主线程窗口。哪个我不在乎:)
- 您处理数据可用的消息,并按照您认为合适的方式处理队列中的任何消息。
代码看起来像这样:
队列...
const
WM_DataAvailable = WM_USER + 1;
var
ThreadSafeQueue: TThreadSafeQueue;
数据被放入队列...
procedure PutDataIntoQueue;
var
MyObject: TMyObject;
begin
MyObject := TMyObject.Create;
ThreadSafeQueue.Enqueue(MyObject);
PostMessage(FMainWindowHandle, WM_DataAvailable, 0, 0);
end;
和处理...
procedure ProcessDataInTheQueue(var Msg: TMessage); message WM_DataAvailable;
procedure ProcessDataInTheQueue(var Msg: TMessage);
var
AnyValue: TAnyValue;
MyObject: TMyObject;
begin
while ThreadSafeQueue.Dequeue(AnyValue) do
begin
MyObject := TMyObject(AnyValue.AsObject);
try
// process the actual object as needed
finally
MyObject.Free
end;
end;
end;
代码是在没有 Delphi 的情况下编写的,并且会检查它是否包含错误。我使用免费提供的线程安全队列和 TAnyValue 展示了这个示例。你可以在这里找到两者:
http://www.cromis.net/blog/downloads/
另请注意,我没有检查 PostMessage 是否实际发送。您应该在生产代码中检查这一点。