AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Fremde Anwendung zerstört Thread

Ein Thema von EWeiss · begonnen am 14. Okt 2013 · letzter Beitrag vom 14. Okt 2013
Antwort Antwort
Seite 1 von 2  1 2      
EWeiss
(Gast)

n/a Beiträge
 
#1

Fremde Anwendung zerstört Thread

  Alt 14. Okt 2013, 19:53
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:
      if WaitForSingleObject(VisTimer, 1000 {1sec}) = WAIT_OBJECT_0 then
      begin
        DoOnVisTimer;
      end else
        Terminate;
gruss

Geändert von EWeiss (14. Okt 2013 um 19:58 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.021 Beiträge
 
Delphi 12 Athens
 
#2

AW: Fremde Anwendung zerstört Thread

  Alt 14. Okt 2013, 20:07
Wie äußert sich denn dieses Zerstören?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#3

AW: Fremde Anwendung zerstört Thread

  Alt 14. Okt 2013, 20:08
Ist der Timer ein Shared Object? Named Timer oder sowas?
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#4

AW: Fremde Anwendung zerstört Thread

  Alt 14. Okt 2013, 20:11
Wie äußert sich denn dieses Zerstören?
In dem Terminate ausgeführt wird.

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
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

AW: Fremde Anwendung zerstört Thread

  Alt 14. Okt 2013, 20:15
Ist der Timer ein Shared Object? Named Timer oder sowas?
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:
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;
gruss
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.154 Beiträge
 
Delphi 12 Athens
 
#6

AW: Fremde Anwendung zerstört Thread

  Alt 14. Okt 2013, 20:19
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#7

AW: Fremde Anwendung zerstört Thread

  Alt 14. Okt 2013, 20:24
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.
Ja!
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.

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

Geändert von EWeiss (14. Okt 2013 um 20:29 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#8

AW: Fremde Anwendung zerstört Thread

  Alt 14. Okt 2013, 20:49
Ist der Timer ein Shared Object? Named Timer oder sowas?
VisTimer := CreateWaitableTimer(nil, False, 'BassVisTimer'); Kann ich jetzt nicht beantworten ob er Shared ist.. sorry!
Zitat:
If the named timer object exists before the function call, the function returns a handle to the existing object and GetLastError returns ERROR_ALREADY_EXISTS.
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:
When an auto-reset timer is signaled, only one waiting thread becomes schedulable.
Damit könnte eventuell ein weiterer Fehler auftreten, indem ein Thread in das Timeout läuft, weil immer andere Threads signalisiert werden.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#9

AW: Fremde Anwendung zerstört Thread

  Alt 14. Okt 2013, 20:54
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.
Danke. Hab wieder was dazu gelernt

Jo.. Ich schließe das Handle.

Delphi-Quellcode:
  if VisTimer <> 0 then
  begin
    if not Suspended then
      ThreadHalt;

    CancelWaitableTimer(VisTimer);
    CloseHandle(VisTimer);
  end;
Werde mal versuchen wie es sich verhält wenn ich auf CloseHandle verzichte.
Abgesehen von eventuellen Speicherlecks die dann wieder entstehen.

gruss
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.351 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Fremde Anwendung zerstört Thread

  Alt 14. Okt 2013, 20:59
Werde mal versuchen wie es sich verhält wenn ich auf CloseHandle verzichte.
Abgesehen von eventuellen Speicherlecks die dann wieder entstehen.
Das Handle wird bei Programmende ohnehin freigegeben, aber besser ist es, das selbst zu machen. Das Problem ist aber CancelWaitableTimer und nicht CloseHandle.

Denn:
Zitat:
Use the CloseHandle function to close the handle. The system closes the handle automatically when the process terminates. The timer object is destroyed when its last handle has been closed.
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx

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?
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:03 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz