代码之家  ›  专栏  ›  技术社区  ›  René Hoffmann esd

如何防止控件销毁后的消息处理

  •  -2
  • René Hoffmann esd  · 技术社区  · 8 年前

    1. TfrmTimeSliceStructure ,它是 TFrame .
    2. THKSDBVirtualStringTree ,它是 TDBVirtualStringTree TVirtualStringTree

    这个 THKSDBVirtualStringTree 组件用作上的子控件 .

    在某些情况下,双击会破坏框架。

    PostMessage 使用自定义消息代码调用 WM_USER + 4 (这是十六进制 $0404

    不过,在许多情况下,会发生访问冲突,因为 THKSDBVirtualStringTree

    我预计在控件破坏后不会发生消息处理。

    下面,您可以看到调试器的输出。在这两个类中,我都在方法中添加了消息日志 WndProc 已收到。

    几行之后,有两行 Instance of class THKSDBVirtualStringTree is going to be destroyed. Instance of class THKSDBVirtualStringTree has been destroyed.
    CM_BASE = $B000; .

    Debug-Ausgabe: Instance of class TfrmTimeSliceStructure recieved message $0404 Prozess Memory.exe (20916)
    Debug-Ausgabe: Instance of class TfrmTimeSliceStructure recieved message $0405 Prozess Memory.exe (20916)
    Debug-Ausgabe: Instance of class TfrmTimeSliceStructure recieved message $8001 Prozess Memory.exe (20916)
    Debug-Ausgabe: Instance of class THKSDBVirtualStringTree recieved message $0200 Prozess Memory.exe (20916)
    Debug-Ausgabe: Instance of class THKSDBVirtualStringTree recieved message $0202 Prozess Memory.exe (20916)
    Debug-Ausgabe: Instance of class THKSDBVirtualStringTree recieved message $0215 Prozess Memory.exe (20916)
    Debug-Ausgabe: Instance of class THKSDBVirtualStringTree recieved message $02A3 Prozess Memory.exe (20916)
    Debug-Ausgabe: Instance of class THKSDBVirtualStringTree recieved message $B014 Prozess Memory.exe (20916)
    Debug-Ausgabe: Instance of class TfrmTimeSliceStructure recieved message $B014 Prozess Memory.exe (20916)
    Debug-Ausgabe: Instance of class TfrmTimeSliceStructure recieved message $8001 Prozess Memory.exe (20916)
    Debug-Ausgabe: Instance of class TfrmTimeSliceStructure recieved message $8001 Prozess Memory.exe (20916)
    Thread-Start: Thread-ID: 6260. Prozess Memory.exe (20916)
    Thread-Start: Thread-ID: 21148. Prozess Memory.exe (20916)
    Thread-Ende: Thread-ID: 6260. Prozess Memory.exe (20916)
    Debug-Ausgabe: Instance of class TfrmTimeSliceStructure recieved message $0002 Prozess Memory.exe (20916)
    Debug-Ausgabe: Instance of class TfrmTimeSliceStructure recieved message $000E Prozess Memory.exe (20916)
    Debug-Ausgabe: Instance of class THKSDBVirtualStringTree recieved message $0272 Prozess Memory.exe (20916)
    Debug-Ausgabe: Instance of class THKSDBVirtualStringTree recieved message $0002 Prozess Memory.exe (20916)
    Debug-Ausgabe: Instance of class THKSDBVirtualStringTree recieved message $000E Prozess Memory.exe (20916)
    Debug-Ausgabe: Instance of class THKSDBVirtualStringTree recieved message $0082 Prozess Memory.exe (20916)
    Debug-Ausgabe: Instance of class TfrmTimeSliceStructure recieved message $0082 Prozess Memory.exe (20916)
    Debug-Ausgabe: Instance of class THKSDBVirtualStringTree is going to be destroyed. Prozess Memory.exe (20916)
    Thread-Ende: Thread-ID: 22156. Prozess Memory.exe (20916)
    Debug-Ausgabe: Instance of class THKSDBVirtualStringTree has been destroyed. Prozess Memory.exe (20916)
    Thread-Start: Thread-ID: 5672. Prozess Memory.exe (20916)
    Debug-Ausgabe: Instance of class THKSDBVirtualStringTree recieved message $B028 Prozess Memory.exe (20916)
    Thread-Start: Thread-ID: 9244. Prozess Memory.exe (20916)
    Debug-Ausgabe: Instance of class THKSDBVirtualStringTree recieved message $B009 Prozess Memory.exe (20916)
    Debug-Ausgabe: Instance of class THKSDBVirtualStringTree recieved message $B008 Prozess Memory.exe (20916)
    Debug-Ausgabe: Instance of class THKSDBVirtualStringTree recieved message $B023 Prozess Memory.exe (20916)
    Debug-Ausgabe: Instance of class THKSDBVirtualStringTree recieved message $B03D Prozess Memory.exe (20916)
    Debug-Ausgabe: Instance of class THKSDBVirtualStringTree recieved message $B050 Prozess Memory.exe (20916)
    Debug-Ausgabe: Instance of class THKSDBVirtualStringTree recieved message $B058 Prozess Memory.exe (20916)
    Debug-Ausgabe: Instance of class THKSDBVirtualStringTree recieved message $B011 Prozess Memory.exe (20916)
    Debug-Ausgabe: Instance of class THKSDBVirtualStringTree recieved message $B03B Prozess Memory.exe (20916)
    Debug-Ausgabe: Instance of class THKSDBVirtualStringTree recieved message $B03B Prozess Memory.exe (20916)
    Debug-Ausgabe: Instance of class THKSDBVirtualStringTree recieved message $B00D Prozess Memory.exe (20916)
    Debug-Ausgabe: Instance of class THKSDBVirtualStringTree recieved message $B022 Prozess Memory.exe (20916)
    Debug-Ausgabe: Instance of class THKSDBVirtualStringTree recieved message $B009 Prozess Memory.exe (20916)
    Debug-Ausgabe: Instance of class THKSDBVirtualStringTree recieved message $B008 Prozess Memory.exe (20916)
    Debug-Ausgabe: Instance of class THKSDBVirtualStringTree recieved message $B023 Prozess Memory.exe (20916)
    Debug-Ausgabe: Instance of class THKSDBVirtualStringTree recieved message $B035 Prozess Memory.exe (20916)
    Debug-Ausgabe: Instance of class THKSDBVirtualStringTree recieved message $B03D Prozess Memory.exe (20916)
    Debug-Ausgabe: Instance of class THKSDBVirtualStringTree recieved message $B050 Prozess Memory.exe (20916)
    Debug-Ausgabe: Instance of class THKSDBVirtualStringTree recieved message $B058 Prozess Memory.exe (20916)
    Debug-Ausgabe: Instance of class THKSDBVirtualStringTree recieved message $B011 Prozess Memory.exe (20916)
    Debug-Ausgabe: Instance of class THKSDBVirtualStringTree recieved message $B009 Prozess Memory.exe (20916)
    Debug-Ausgabe: Instance of class THKSDBVirtualStringTree recieved message $B035 Prozess Memory.exe (20916)
    Debug-Ausgabe: Instance of class THKSDBVirtualStringTree recieved message $B034 Prozess Memory.exe (20916)
    Debug-Ausgabe: Instance of class THKSDBVirtualStringTree recieved message $B009 Prozess Memory.exe (20916)
    Debug-Ausgabe: Instance of class THKSDBVirtualStringTree recieved message $B03B Prozess Memory.exe (20916)
    Debug-Ausgabe: Instance of class THKSDBVirtualStringTree recieved message $B008 Prozess Memory.exe (20916)
    Debug-Ausgabe: Instance of class THKSDBVirtualStringTree recieved message $B00E Prozess Memory.exe (20916)
    Debug-Ausgabe: Instance of class THKSDBVirtualStringTree recieved message $B034 Prozess Memory.exe (20916)
    Debug-Ausgabe: Instance of class THKSDBVirtualStringTree recieved message $B008 Prozess Memory.exe (20916)
    Debug-Ausgabe: Instance of class THKSDBVirtualStringTree recieved message $B00E Prozess Memory.exe (20916)
    Debug-Ausgabe: Instance of class THKSDBVirtualStringTree recieved message $B034 Prozess Memory.exe (20916)
    Thread-Ende: Thread-ID: 5672. Prozess Memory.exe (20916)
    Thread-Ende: Thread-ID: 21148. Prozess Memory.exe (20916)
    Debug-Ausgabe: Instance of class THKSDBVirtualStringTree recieved message $B007 Prozess Memory.exe (20916)
    Erste Gelegenheit für Exception bei $01819981. Exception-Klasse $C0000005 mit Meldung 'access violation at 0x01819981: read of address 0x00000050'. Prozess Memory.exe (20916)
    
    1 回复  |  直到 8 年前
        1
  •  4
  •   René Hoffmann esd    8 年前

    问题是由对的显式调用引起的 Application.ProcessMessages 在我们的 OnNodeDblClick

    不幸的是,我们的代码库中仍然有一些这样的调用:-(


    正如你在问题中看到的那样,我尝试了以下两种方法:

    1. 覆盖控件的 WndProc OutputDebugString .
    2. OutputDebugString

    后来,我想到。。。

    1. ...检查启动用户交互(此处:双击)是否已完全处理。这件事就要解决了
      在我的例子中,在发生访问冲突之前,没有完全处理第二次鼠标按下。

    然后我可以得出结论,消息队列在某些地方被过早处理。所以,我必须找出,在哪里 被称为。

    1. 因此,我在这个方法中添加了一个断点。因为正常的断点会破坏消息处理。我使用了另一种断点类型,我必须承认,这是我第一次使用的。
      在断点的 高级设置 打破 并已选定 相反我决定只记录两个堆栈帧,因为我只想知道谁是 应用处理消息

    .

    1. 现在,我可以推断 在开始未完成的鼠标按下处理程序之后,在接收我的自定义事件之前 WM_USER + 4 必须是那个打破密码的人。
    推荐文章