Frage

Ist

OutputDebugString(PAnsiChar(''));

Thread-sicher?

ich / wir haben es in Threads für das Debuggen verwendet wird, und es nie fiel mir ein, wenn ich es eine andere Art und Weise tun sollten.

(Delphi 7)

War es hilfreich?

Lösung

Keine Sorge, es ist.

  

Wenn Output () von einer Anwendung aufgerufen wird, ist es diese nimmt   Schritte. Beachten Sie, dass ein Fehler an einer beliebigen Stelle verlässt die ganze Sache und   behandelt die Debugging-Anforderung als eine no-op (die Zeichenfolge nicht gesendet wird,   überall).

     
      
  1. Öffnen DBWinMutex und warten, bis wir einen exklusiven Zugang zu ihm haben.
  2.   
  3. Karte des DBWIN_BUFFER Segment in den Speicher: Wenn es nicht gefunden wird,   es gibt keinen Debugger, so dass die gesamte Anforderung ignoriert ausgeführt wird.
  4.   
  5. die DBWIN_BUFFER_READY und DBWIN_DATA_READY Ereignisse öffnen. wie bei   das Shared-Memory-Segment, bedeuten fehlende Objekte, dass kein Debugger   zur Verfügung.
  6.   
  7. Warten Sie auf die DBWIN_BUFFER_READY Ereignis signalisiert werden: dies sagt   daß der Speicherpuffer nicht mehr in Gebrauch ist. Die meiste Zeit, diese   Ereignis wird sofort signalisiert werden, wenn geprüft wird, aber es wird nicht   warten länger als 10 Sekunden für die Puffer bereit zu werden (ein Timeout   verlässt die Anfrage).
  8.   
  9. Kopieren von bis zu etwa 4KBytes von Daten in den Speicherpuffer und Speicher   die aktuelle Prozess-ID auch dort. Setzen Sie immer ein NUL-Byte am Ende   die Zeichenfolge.
  10.   
  11. Sagen Sie den Debugger, der Puffer, indem die bereit ist,   DBWIN_DATA_READY Ereignis. Der Debugger nimmt es von dort.
  12.   
  13. Lassen Sie die Mutex
  14.   
  15. Schließen Sie die Veranstaltungs- und Abschnitt Objekte, obwohl wir den Griff halten   der Mutex um für später.
  16.   

Andere Tipps

Nun, nicht, dass es nicht wahr ist, ist es, aber nur so, dass Sie sich dafür nicht nur nehmen Lieven Wort:

  

Passing von Daten zwischen dem   Anwendung und der Debugger erfolgt   über einen 4kByte chunk des gemeinsam genutzten Speichers,   mit einem Mutex und zwei Ereignisobjekte   Schutz Zugang zu ihr. Dies sind die   vier Kernel-Objekte beteiligt.

Win32 Output zu verstehen, ist ein ausgezeichneter Artikel über die Angelegenheit.

ich Probleme habe einmal hat, aber mit Zeichenfolge in einem ISAPI-DLL. die IsMultiThread boolean definiert in System.pas Aus irgendeinem Grund wurde nicht gesetzt!

Es wurde verursacht seltsame AccessViolations, sobald der Faden wurde mehr als ein Thread läuft ... Ein einfaches „IsMultiThread: = true;“ in einer Einheit Initialisierung es festgelegt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top