Question

est

OutputDebugString(PAnsiChar(''));

thread-safe?

I / nous utilisons dans les discussions pour le débogage, et il ne me suis jamais si je devrais le faisons d'une manière différente.

(Delphi 7)

Était-ce utile?

La solution

Ne vous inquiétez pas, il est.

  

Quand OutputDebugString () est appelée par une application, il faut ces   pas. Notez qu'un échec à tout moment abandonne la chose et   traite la demande de mise au point en tant que no-op (la chaîne n'est pas envoyé   nulle part).

     
      
  1. Ouvrir DBWinMutex et attendre jusqu'à ce que nous ayons accès exclusif.
  2.   
  3. Carte du segment DBWIN_BUFFER en mémoire: si elle est introuvable,   il n'y a pas débogueur en cours d'exécution si la demande est entièrement ignorée.
  4.   
  5. Ouvrir les événements DBWIN_BUFFER_READY et DBWIN_DATA_READY. Comme avec   le segment de mémoire partagée, les objets manquants signifie qu'aucun débogueur   disponible.
  6.   
  7. Attendez que l'événement DBWIN_BUFFER_READY à signaler: ce dit   que la mémoire tampon ne soit plus en cours d'utilisation. La plupart du temps, cette   événement sera signalé immédiatement quand il est examiné, mais il ne sera pas   attendre plus de 10 secondes pour que le tampon soit prêt (un délai d'attente   abandonne la demande).
  8.   
  9. Copier jusqu'à environ 4 Ko de données dans la mémoire tampon de mémoire, et stocker   le processus actuel ID là aussi. Toujours mettre un octet NUL à la fin   de la chaîne.
  10.   
  11. Dites-le débogueur que le tampon est prêt en réglant la   événement DBWIN_DATA_READY. Le débogueur prend de là.
  12.   
  13. Relâchez le mutex
  14.   
  15. Fermez les objets de l'événement et la section, mais nous gardons la poignée   le mutex autour pour plus tard.
  16.   

Autres conseils

Eh bien, pas que ce n'est pas vrai, il est, mais juste pour que vous ne devez pas prendre tout mot Lieven pour elle:

  

Transfert des données entre le   l'application et le débogueur est fait   par l'intermédiaire d'un bloc de 4 Ko de mémoire partagée,   avec un Mutex et deux objets de l'événement   protéger l'accès. Voici les   quatre objets noyau impliqués.

Comprendre Win32 OutputDebugString est un excellent article sur la question.

Je l'ai une fois eu du mal, cependant, avec des chaînes dans une DLL ISAPI. Pour une raison étrange, le booléen IsMultiThread défini dans System.pas n'a pas été défini!

Il a été à l'origine AccessViolations étrange, une fois que le fil est en cours d'exécution plus d'un fil ... Un simple « IsMultiThread: = true; » dans une unité d'initialisation réparée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top