在Delphi中,OutputDebugString线程安全吗?

时间:2009-02-03 23:41:15

标签: multithreading delphi delphi-7 outputdebugstring

OutputDebugString(PAnsiChar(''));

线程安全?

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

(德尔福7)

3 个答案:

答案 0 :(得分:26)

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

  

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

Understanding Win32 OutputDebugString是一篇关于此事的优秀文章。

答案 1 :(得分:18)

别担心,是的。

  

当应用程序调用OutputDebugString()时,它会采用这些   脚步。请注意,任何时候的失败都会放弃整个事情   将调试请求视为无操作(不发送字符串   任意位置)。

     
      
  1. 打开DBWinMutex并等到我们可以独占访问它。
  2.   
  3. 将DBWIN_BUFFER段映射到内存中:如果找不到,   没有运行调试器,因此忽略整个请求。
  4.   
  5. 打开DBWIN_BUFFER_READY和DBWIN_DATA_READY事件。和。一样   共享内存段,缺少对象意味着没有调试器   可用。
  6.   
  7. 等待DBWIN_BUFFER_READY事件发出信号:这就是说   内存缓冲区不再使用。大多数时候,这个   事件将在检查时立即发出信号,但事实并非如此   等待超过10秒以使缓冲区准备就绪(超时)   放弃要求)。
  8.   
  9. 将大约4千字节的数据复制到内存缓冲区并存储   那里还有当前的进程ID。总是在最后放一个NUL字节   字符串。
  10.   
  11. 通过设置,告诉调试器缓冲区已准备就绪   DBWIN_DATA_READY事件。调试器从那里获取它。
  12.   
  13. 释放互斥锁
  14.   
  15. 关闭Event和Section对象,但我们保留句柄   以后的互斥体。
  16.   

答案 2 :(得分:3)

我曾经遇到过ISAPI DLL中的字符串问题。由于某些奇怪的原因,未在System.pas中定义的IsMultiThread布尔值!

一旦线程运行多个线程,它就会导致奇怪的AccessViolations ...一个简单的“IsMultiThread:= true;”在单元初始化中修复它。