![]() |
Fremde Anwendung zerstört Thread
Ich starte zwei unterschiedliche Programme die beide meine DLL verwenden.
Die DLL befindet sich im jeweiligen Anwendungspfad und ist weder in Window noch darunter liegenden Pfade abgelegt. Trotzdem zerstören diese meinen RenderThread wenn ein Programm geschlossen wird und zwar immer den des noch offenen Programm (innerhalb der gerade verwendeten DLL) Wie kann ich das verhindern? Dürfte doch eigentlich nicht passieren. Wie kann also eine andere Anwendung Terminate auslösen von gleicher aber unterschiedlich verwendeten DLL's in unterschiedlichen Pfaden.
Delphi-Quellcode:
gruss
if WaitForSingleObject(VisTimer, 1000 {1sec}) = WAIT_OBJECT_0 then
begin DoOnVisTimer; end else Terminate; |
AW: Fremde Anwendung zerstört Thread
Wie äußert sich denn dieses Zerstören?
|
AW: Fremde Anwendung zerstört Thread
Ist der Timer ein Shared Object? Named Timer oder sowas?
|
AW: Fremde Anwendung zerstört Thread
Zitat:
Da scheint ein problem mit WaitForSingleObject vorzuliegen. Aber irgendwie unverständlich weil wie schon gesagt die DLL's in unterschiedlichen Pfaden liegen. Andere Anwendungen sind davon nicht betroffen nur die welche die gleiche DLL verwenden. Egal ob VB/Delphi oder sonst was. gruss |
AW: Fremde Anwendung zerstört Thread
Zitat:
Delphi-Quellcode:
VisTimer := CreateWaitableTimer(nil, False, 'BassVisTimer');
Kann ich jetzt nicht beantworten ob er Shared ist.. sorry! Deshalb etwas mehr code da kannst du vielleicht erkennen ob dies der Fall ist.
Delphi-Quellcode:
gruss
procedure TVisDataThread.Execute;
const _SECOND = 10000000; var qwDueTime: Int64; liDueTime: _LARGE_INTEGER; ErrMsg: string; begin if VisTimer = 0 then Exit; // Create a negative 64-bit integer that will be used to // signal the timer 1/4 seconds from now. qwDueTime := -1 * (_SECOND div 4); // Copy the relative time into a LARGE_INTEGER. liDueTime.LowPart := DWORD(qwDueTime and $FFFFFFFF); liDueTime.HighPart := longint(qwDueTime shr 32); if MySetWaitableTimer(VisTimer, // handle to a timer object TLargeInteger(liDueTime), // when timer will become signaled FDelayMS, // periodic timer interval nil, // pointer to the completion routine nil, // data passed to the completion routine False {flag for resume state}) then // Following sentences are repeated every FDelayMS interval all the time from initial // start up to program end. repeat // We need to re-adjust timer interval according to the parameter "DelayMS" of vis plug-in. // (in case we exchange vis plug-ins) if FDelayMSChanged then begin FDelayMSChanged := False; CancelWaitableTimer(VisTimer); MySetWaitableTimer(VisTimer, TLargeInteger(liDueTime), FDelayMS, nil, nil, False); end; if WaitForSingleObject(VisTimer, 1000 {1sec}) = WAIT_OBJECT_0 then begin DoOnVisTimer; end else Terminate; SuspendIfHalted; until Terminated else begin ErrMsg := SysErrorMessage(GetLastError); ShowErrorMsgBox(ErrMsg); Terminate; end; end; |
AW: Fremde Anwendung zerstört Thread
Selbst wenn in beiden Programmen die selbe DLL geladen würde, wären diese grundsätzlich eigentlich erstmal vollkommen unabhängig voneinander, da jede DLL in den Prozesspeicher der zugehörigen EXE geladen werden. Und seit WinNT ist dierst Speicher vollständig getrennt.
Außer man bindet z.B. gemeinsame MMFs in die Prozessspeicher ein oder tauscht sonstwie "absichtlich" irgendwelche Handles, Speicher und sonstwelche externen Dinge. |
AW: Fremde Anwendung zerstört Thread
Zitat:
Abgesehen ich würde diese in Windows/System32 oder darunter ablegen. In dem Fall dürfte dann ausschließlich diese verwendet werden aber das ist ja nicht der Fall. Problem könnte sein wenn diese in SysWow64 abgelegt wird.. aber hab da nix gefunden Kann ich mir auch nicht vorstellen denn diese ist ja 32Bit. Wie kann aber ein andere Anwendung auf den Thread einfluss nehmen bzw.. warum tritt dann diese Abfrage nicht mehr ein? sobald die andere geschlossen wird.
Delphi-Quellcode:
if WaitForSingleObject(VisTimer, 1000 {1sec}) = WAIT_OBJECT_0 then
Ich kann es daran erkennen! Verwendet die fremde Anwendung ein anderes Plugin Kind also anstatt Winamp > Sonique dann läuft der Thread von Winamp als bsp. weiter. gruss |
AW: Fremde Anwendung zerstört Thread
Zitat:
Zitat:
[ Vermutlich also ja: Alle deine Instanzen teilen sich einen Timer.![]() Was machst du mit dem Timer am Programmende? Ein CloseHandle sollte eigentlich keine Probleme machen; wenn du ihn deaktivierst, würde das deinen Fehler erklären. Außerdem: Zitat:
[ Damit könnte eventuell ein weiterer Fehler auftreten, indem ein Thread in das Timeout läuft, weil immer andere Threads signalisiert werden.![]() |
AW: Fremde Anwendung zerstört Thread
Zitat:
Jo.. Ich schließe das Handle.
Delphi-Quellcode:
Werde mal versuchen wie es sich verhält wenn ich auf CloseHandle verzichte.
if VisTimer <> 0 then
begin if not Suspended then ThreadHalt; CancelWaitableTimer(VisTimer); CloseHandle(VisTimer); end; Abgesehen von eventuellen Speicherlecks die dann wieder entstehen. gruss |
AW: Fremde Anwendung zerstört Thread
Zitat:
Denn: Zitat:
![]() Allerdings frage ich mich, ob es bei deinem Anwendungszweck überhaupt Sinn macht einen Namen für den Timer anzugeben. Warum machst du das? Denn viel sinnvoller wäre doch wohl mit unbenannten Timern unabhängig voneinander zu arbeiten, oder? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:44 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz