在Delphi中,OutputDebugString线程安全吗?
-
21-08-2019 - |
题
是
OutputDebugString(PAnsiChar(''));
线程安全?
我/我们一直在线程中使用它进行调试,并且我从未想过是否应该以不同的方式进行操作。
(德尔福7)
解决方案
别担心,确实如此。
当应用程序调用 OutputDebugString() 时,它会获取以下信息 步骤。请注意,任何一点的失败都会导致整个过程的失败,并且 将调试请求视为无操作(不发送字符串 随处可见)。
- 打开 DBWinMutex 并等待,直到我们拥有对它的独占访问权限。
- 将 DBWIN_BUFFER 段映射到内存中:如果找不到它,则没有运行调试器,因此忽略了整个请求。
- 打开 DBWIN_BUFFER_READY 和 DBWIN_DATA_READY 事件。与 在共享内存段中,丢失对象意味着没有调试器 可用。
- 等待 DBWIN_BUFFER_READY 事件发出信号:这就是说 内存缓冲区已不再使用。大多数情况下 事件被检查时会立即发出信号,但不会 等待缓冲区准备就绪的时间超过 10 秒(超时)。 放弃请求)。
- 将最多约 4kbytes 的数据复制到内存缓冲区,并存储 当前流程 ID 也在这里。总是在最后输入一个 NUL 字节 的字符串。
- 告诉调试器,通过设置DBWIN_DATA_READY事件可以准备好缓冲区。调试器从那里获取它。
- 释放互斥体
- 关闭事件和部分对象,尽管我们将静音的句柄保留在稍后。
其他提示
好了,不说这是不正确的,它是,但只是让你不必只取利芬的话:
的之间的数据传 应用程序和调试完成 通过共享存储器的一个4K字节块, 用互斥锁和两个事件对象 保护访问它。这些是 4名内核对象参与。
理解的Win32的OutputDebugString 是对此事优异的制品。
我有麻烦一次,不过,在一个ISAPI DLL的字符串。一些奇怪的原因在System.pas定义的IsMultiThread布尔未设置!
它是造成怪异AccessViolations,一旦线程正在运行一个多线程...一个简单的“IsMultiThread:= TRUE;”在一个单元初始化固定它。
不隶属于 StackOverflow