AGB  ·  Datenschutz  ·  Impressum  







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

Thread 100% beendet?

Ein Thema von EWeiss · begonnen am 6. Aug 2011 · letzter Beitrag vom 25. Aug 2011
Antwort Antwort
EWeiss
(Gast)

n/a Beiträge
 
#1

Thread 100% beendet?

  Alt 6. Aug 2011, 09:41
Wie kann ich sicherstellen da ein Thread (Library) 100% beendet wurde bevor ich einen neuen starte.

EDIT:
Mal anders..

Delphi-Quellcode:
   if Vismod[VismodIndex] <> nil then
     Vismod[VismodIndex]^.Quit(Vismod[VismodIndex]);

   getVisHeader2 := nil;
   if VisDLLHandle <> 0 then
   begin
      FreeLibrary(VisDLLHandle);
      VisDLLHandle := 0;
      LoadedVisDLL := '';
   end;
Ich beende das aktive modul setze den Header auf nil
Dann beende ich das Plugin mit FreeLibrary.

Nur wer garantiert mir das dass Plugin auch entladen wurde.
Wie kann ich also gegenprüfen das die Library 100% beendet wurde
bevor eine neue Instanz davon (oder ein anderes) gestartet wird.



gruss

Geändert von EWeiss ( 6. Aug 2011 um 10:27 Uhr)
  Mit Zitat antworten Zitat
FredlFesl

Registriert seit: 19. Apr 2011
293 Beiträge
 
Delphi 2009 Enterprise
 
#2

AW: Thread 100% beendet?

  Alt 6. Aug 2011, 10:35
Du meinst also, 'FreeLibrary' würde nicht reichen?

Die anderen Threads können doch warten, bis das Handle=0 ist (natürlich mit einer critical section gekapselt).
Das Bild hängt schief.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

AW: Thread 100% beendet?

  Alt 6. Aug 2011, 10:43
Du meinst also, 'FreeLibrary' würde nicht reichen?

Die anderen Threads können doch warten, bis das Handle=0 ist (natürlich mit einer critical section gekapselt).
Ja das ist mein Problem
Das während eines RenderThreads seitens der Library diese noch nicht entladen wurde wenn ich eine neue Instanz starte.
Es soll ja Leute geben die einfach mal schnell durch die Liste Klicken das kann zur folge haben das die Anwendung hängt.

Hast du vielleich ein kleines Beispiel für mich?
Was ich zwischen FreeLibrary und bevor ich das Handle selbst auf 0 setze
einfügen müßte?

Hab mich mit critical section noch nicht beschäftigt
Ih muss also sicher sein das dass Libray Handle 0 ist.
Nicht selber setzen wie bisher sondern darauf hin prüfen wie auch immer.

PS:
Habe mir da mal durchgelesen
Critical Section

Aber so richtig schlau werde ich dadurch nicht!

gruss

Geändert von EWeiss ( 6. Aug 2011 um 11:01 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

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

AW: Thread 100% beendet?

  Alt 6. Aug 2011, 11:31
Es soll ja Leute geben die einfach mal schnell durch die Liste Klicken das kann zur folge haben das die Anwendung hängt.
Ich glaube dein Problem liegt woanders...
Ich vermute, dass der Aufruf von FreeLibrary schlicht hängt und der Quelltext danach gar nicht mehr ausgeführt wird.
Ih muss also sicher sein das dass Libray Handle 0 ist.
Das Handle hat nichts mit dem tatsächlichen Zustand zu tun. Das Handle ist wie der Name schon sagt nur ein "Henkel", also ein Anfasser, mit dem du auf die DLL zugreifst. Nicht mehr.

Das Problem kann z.B. sein, dass du Threadsynchronisierung im Zusammenspiel mit WaitFor benutzt. Dann kann ein Deadlock entstehen. Diesen Fall könntest du mit Messages statt Synchronisierung lösen.

Du musst jedenfalls denke ich nicht sicherstellen, dass FreeLibrary fertig durchgeführt wurde, sondern das vor dessen Aufruf alle Threads in der DLL beendet sind...
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

AW: Thread 100% beendet?

  Alt 6. Aug 2011, 11:57
Zitat:
dass du Threadsynchronisierung im Zusammenspiel mit WaitFor benutzt
Nein verwende ich nicht.
Es läuft auch nur ein Thread bzw. nur ein Plugin zur gleichen zeit.

Zitat:
schlicht hängt und der Quelltext danach gar nicht mehr ausgeführt wird.
Wie soll ich das prüfen ?
Setze ich nen breakpoint nach dem der Thread beendet wurde habe ich das problem nie.

Zitat:
sondern das vor dessen Aufruf alle Threads in der DLL beendet sind...
Hmm ich mache nichts anderes.

Ich sende eine Message
PostThreadMessage(DriveThreadId, WM_QUIT, 0, 0); Welche den aktuellen Thread beendet.
Danach rufe ich meine unload procedure auf die den hier gesendeten Quelltext enthält.

siehe Post 1.

danach setze ich die Variablen auf default werte.


Delphi-Quellcode:
   DriveThreadId := 0;
   WindowEmbed := 0;
   BassVis1.VisWinHandle := 0;
   VisClientHandle := 0;

   SetWindowLong(MainWinHandle, GWL_WNDPROC, LongInt(MainWindowProc));
   BassWinampVisFree := True;

   DebugString('BassVis.dll', 'BASSVIS_WinampThread Destroy', 'EndByThread = ' + booltostr(EndByThread));
   DebugString('BassVis.dll', 'BASSVIS_WinampThread Destroy', 'Rendering = ' + booltostr(GoRendering));
   DebugString('BassVis.dll', 'BASSVIS_WinampThread Destroy', 'VisUnload = ' + booltostr(VisualizerUnloading));
   DebugString('BassVis.dll', 'BASSVIS_WinampThread Destroy', 'VisFree = ' + booltostr(BassWinampVisFree));
   DebugString('BassVis.dll', 'BASSVIS_WinampThread Destroy', 'End');

   DebugStringStop('BASSVIS_WinampThread', 'Destroy');

   Result := 0;
   EndThread(0);
So!
Während das alles geschieht startet aber schon der neue Thread. bzw.. ist schon am laufen.

Mein Problem ist dann wie schon gesagt das wenn zu schnell in der Liste rumgeklickt wird.
Die Anwendung hängt wenn plötzlich zwei Threads gleichzeitig laufen und der erstet nicht beendet wurde.
Das kann vorkommen aber nicht immer.

Und das ist mein Problem.

PS:
Ich muss also irgendwie 100% sicher sein das dass alte Plugin entladen wurde.
bzw. der alte Thread.
Oder?

Wie kann ich das also verhindern das der neue starte bevor nicht alles auf 0 steht.

EDIT:
Ich erstelle schon eine critical section (auch wenn ich nicht genau weiss was das teil macht)

LockFlag := TCriticalSection.Create;
Allerdings nur für meinen RenderThread und protected (sind schon mehr Threads allerdings nur gültig für ein Plugin)
So wie ich aber gelesen habe soll man nicht mehrere verwenden ..


gruss

Geändert von EWeiss ( 6. Aug 2011 um 12:55 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

AW: Thread 100% beendet?

  Alt 24. Aug 2011, 14:27
Hab immer noch nicht die richtige lösung die mir garantiert das mein thread 100% beendet wurde.
Oder woran könnte es liegen das sporadisch manchmal die Anwendung hängt?

Ja ist schwierig eine Antwort zu finden wenn man den Quelltext nicht kennt.

Noch jemand eine idee?

gruss
  Mit Zitat antworten Zitat
Tryer

Registriert seit: 16. Aug 2003
200 Beiträge
 
#7

AW: Thread 100% beendet?

  Alt 24. Aug 2011, 21:41
MSDN-Library durchsuchenFreeLibraryAndExitThread
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#8

AW: Thread 100% beendet?

  Alt 24. Aug 2011, 22:40
Du könntest mit WaitForSingleObject warten bis der Thread signalisiert. In meinem Thread Tutorial müsste eine Demo dazu vorhanden sein.
Michael
Ein Teil meines Codes würde euch verunsichern.

Geändert von Luckie (24. Aug 2011 um 22:43 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#9

AW: Thread 100% beendet?

  Alt 25. Aug 2011, 10:33
Du könntest mit WaitForSingleObject warten bis der Thread signalisiert. In meinem Thread Tutorial müsste eine Demo dazu vorhanden sein.
Danke dir..

Werde es mir mal anschauen.

gruss
  Mit Zitat antworten Zitat
Antwort Antwort


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 18:09 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