В Delphi поток OutputDebugString безопасен? - PullRequest
16 голосов
/ 04 февраля 2009

Is

OutputDebugString(PAnsiChar(''));

Поток безопасен?

Я / мы использовали его в потоках для отладки, и мне никогда не приходило в голову, стоит ли делать это по-другому.

(Delphi 7)

Ответы [ 3 ]

26 голосов
/ 04 февраля 2009

Ну, не то, чтобы это не было правдой, это так, но просто для того, чтобы вам не нужно было просто брать слово Ливен за это:

Передача данных между приложение и отладчик сделан через 4-килобайтный кусок общей памяти, с мьютексом и двумя объектами Event защита доступа к нему. Эти задействовано четыре объекта ядра.

Понимание Win32 OutputDebugString - отличная статья по этому вопросу.

18 голосов
/ 04 февраля 2009

Не волнуйтесь, это так.

Когда OutputDebugString () вызывается приложением, оно принимает шаги. Обратите внимание, что отказ в любой момент оставляет все это и обрабатывает запрос на отладку как неактивный (строка не отправляется в любом месте).

  1. Откройте DBWinMutex и дождитесь эксклюзивного доступа к нему.
  2. Отображение сегмента DBWIN_BUFFER в память: если он не найден, отладчик не работает, поэтому весь запрос игнорируется.
  3. Откройте события DBWIN_BUFFER_READY и DBWIN_DATA_READY. Как с сегмент разделяемой памяти, отсутствующие объекты означают, что нет отладчика имеется.
  4. Подождите, пока будет сообщено событие DBWIN_BUFFER_READY: это говорит что буфер памяти больше не используется. В большинстве случаев это событие будет сигнализировано сразу же после его изучения, но оно не будет подождите больше 10 секунд, пока буфер не будет готов (тайм-аут отказывается от запроса).
  5. Скопируйте до 4 Кбайт данных в буфер памяти и сохраните текущий идентификатор процесса там тоже. Всегда ставьте нулевой байт в конце строки.
  6. Сообщите отладчику, что буфер готов, установив DBWIN_DATA_READY событие. Отладчик берет это оттуда.
  7. Отпустить мьютекс
  8. Закройте объекты Event и Section, хотя мы сохраняем дескриптор мьютекс вокруг на потом.
3 голосов
/ 07 апреля 2009

У меня однажды были проблемы со строками в ISAPI DLL. По какой-то странной причине логическое значение IsMultiThread, определенное в System.pas, не было установлено!

Это вызывало странные AccessViolations, когда поток выполнял более одного потока ... Простой "IsMultiThread: = true;" в инициализации блока это исправлено.

...