在尝试调用后,OTL 中引发了异常PostMessage
.
procedure TOmniContainerWindowsMessageObserverImpl.Send(aMessage: cardinal;
wParam, lParam: integer);
begin
Win32Check(PostMessage(cwmoHandle, aMessage, wParam, lParam));
end;
该异常表明带有句柄的窗口的消息队列cwmoHandle
已满且未及时提供服务。该窗口的句柄由以下命令创建TOmniMessageQueue
当你分配给它时OnMessage
财产。最有可能的是进行此分配的线程被阻塞(或阻塞时间太长)并且没有及时处理消息。
procedure TOmniMessageQueue.SetOnMessage(const value: TOmniMessageQueueMessageEvent);
begin
if (not assigned(mqWinMsgObserver.OnMessage)) and assigned(value) then begin // set up observer
mqWinMsgObserver.Window := DSiAllocateHWnd(WndProc); // CREATED HERE**
mqWinMsgObserver.Observer := CreateContainerWindowsMessageObserver(
mqWinMsgObserver.Window, MSG_CLIENT_MESSAGE, 0, 0);
ContainerSubject.Attach(mqWinMsgObserver.Observer, coiNotifyOnAllInserts);
mqWinMsgObserver.Observer.Activate;
end
else if assigned(mqWinMsgObserver.OnMessage) and (not assigned(value)) then begin // tear down observer
mqWinMsgObserver.Observer.Deactivate;
ContainerSubject.Detach(mqWinMsgObserver.Observer, coiNotifyOnAllInserts);
FreeAndNil(mqWinMsgObserver.Observer);
DSiDeallocateHWnd(mqWinMsgObserver.Window);
end;
mqWinMsgObserver.OnMessage := value;
end;
为了更具体地回答,我们需要查看更多代码来显示您在何处以及如何实现 OTL 对象。唯一的其他线索是你的帖子是这样的;
thread $1160 (TOmniThread): <priority:-15>
这表明引发异常的线程正在以较低的优先级运行。除了您的应用程序正在主动更改线程优先级之外,这本身并不能解释任何事情。没有代码来分析就没有办法说,但是你的程序的结构可能会导致优先级反转阻碍所属线程处理消息的能力的问题。