当前位置:  开发笔记 > 程序员 > 正文

在Delphi中,OutputDebugString线程安全吗?

如何解决《在Delphi中,OutputDebugString线程安全吗?》经验,为你挑选了2个好方法。

OutputDebugString(PAnsiChar(''));

线程安全?

我/我们一直在线程中使用它来进行调试,如果我以不同的方式做这件事我就不会想到它.

(德尔福7)



1> Jorge Córdob..:

嗯,不是说它不是真的,它是,但只是为了让你不必只是为了它而得到Lieven的话:

应用程序和调试器之间的数据传递是通过一个4k字节的共享内存块完成的,其中一个Mutex和两个Event对象保护对它的访问.这些是涉及的四个内核对象.

了解Win32 OutputDebugString是一篇很好的文章.



2> Lieven Keers..:

别担心,确实如此.

当应用程序调用OutputDebugString()时,它将采取这些步骤.请注意,任何时候的失败都会放弃整个过程并将调试请求视为无操作(字符串不会在任何地方发送).

    打开DBWinMutex并等到我们拥有它的独占访问权限.

    将DBWIN_BUFFER段映射到内存中:如果找不到,则没有调试器运行,因此忽略整个请求.

    打开DBWIN_BUFFER_READY和DBWIN_DATA_READY事件.与共享内存段一样,缺少对象意味着没有可用的调试器.

    等待DBWIN_BUFFER_READY事件发出信号:这表示内存缓冲区已不再使用.大多数情况下,此事件将在检查时立即发出信号,但缓冲区不会等待超过10秒(超时放弃请求).

    将最多约4k字节的数据复制到内存缓冲区,并将当前进程ID存储在那里.始终在字符串的末尾放置一个NUL字节.

    通过设置DBWIN_DATA_READY事件告诉调试器缓冲区已准备就绪.调试器从那里获取它.

    释放互斥锁

    关闭Event和Section对象,尽管我们将句柄保持在互斥体上以便以后使用.

推荐阅读
手机用户2502852037
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有