【发布时间】:2011-03-20 21:14:40
【问题描述】:
我有一个多线程的 Delphi 6 Pro 应用程序,我目前正在大量工作。如果我在主线程(VCL 线程)上下文中运行的任何代码上设置断点,我没有任何问题。但是,如果在我的其他线程之一中的任何代码上触发了断点,则在我从断点继续应用程序之后,对主线程(包括主窗体)上的 VCL 组件的所有重绘都不会再发生。应用程序没有死,因为其他后台代码一直在运行,只是主线程。就好像 Windows 消息调度程序已损坏或处于休眠状态。
注意,在这个应用程序中,我通过主窗体上的 allocateHwnd() 分配我自己的 WndProc(),因为我需要捕获某些已注册的消息。我从那个 WndProc() 发送我处理的任何自定义消息,如果我的代码没有处理当前消息,我通过调用主窗体的继承 WndProc() 来传递消息。如果我确实处理了当前消息,我只需从 WndProc() 返回并将 Msg.Result 设置为 1,以告诉调度程序该消息已被处理。我不能简单地覆盖 TForm WndProc() 而不是分配我自己的 WndProc(),因为由于某种原因,Delphi VCL 不会通过使用 Windows API RegisterWindowMessage() 调用实例化的注册消息。
有没有人在类似的情况下遇到过这种情况,如果有,你做了什么来解决它?
-- 罗舍尔
【问题讨论】:
-
我从未遇到过在被覆盖的 WndProc 中处理 Windows 消息的问题。也许代码示例将有助于查看问题所在。
-
我唯一的想法是通过覆盖和揭开它来检查窗口实际上是否没有刷新。可能是窗口不知道需要更新。
-
这不是一个修复,但是当你强制更新/绘制/刷新时会发生什么?
标签: multithreading delphi vcl repaint wndproc