Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Thread vorzeitig beenden

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
19.02.2007, 19:38 Uhr
~7513
Gast


Hallo,
ich habe folgende Idee:
In einen Prozess wird ein Thread gestartet
1. Thread - Eingabe und spätere Ausgabe eines Speicherarrays (z.Bsp. ein Bild).
Dieser Thread initialisiert einen
2. Thread - Algorithmus zur Bildverbesserung (Black-Box, sollte nicht verändert werden).

Ablauf:
1. Thread - Einlesen des Speichersbereichs
2. Thread - beginnt mit der Arbeit über diesen Speicherbereich

nach einer gewissen Zeit
1. Thread - unterbricht den 2. Thread noch vor dessen Beendigung (notwendig, wenn die zur Verfügung stehende Zeit abgelaufen ist)
1. Thread - Ausgabe des Speicherbereichs

Erste Vorstellung einer Umsetzungsmöglichkeit (Pseudo- bzw. unvollständiger Code):
//begin
...
// Bilddaten zum Filter senden
filter->setIn(image_in);

hThreadEnh = (HANDLE)_beginthreadex( NULL, 0, Run, NULL, CREATE_SUSPENDED, &uiThreadEnhID );

ResumeThread( hThreadEnh );
WaitForSingleObject( hThreadEnh, 20 );
SuspendThread(hThreadEnh);

// Bilddaten vom Filter holen
filter->getOut(image_out);

//Kill thread
?
...
//end

Das Problem ist nun sicherlich, dass der erzeugte Thread weiterhin existiert. Er sollte aber ganz verschwinden bzw. terminieren und seine reservierten Ressourcen wieder freigegeben. Der Befehl TerminateThread( hThreadEnh,0); reicht nach der Recherche einiger Posts im Forum wohl nicht aus. Auch der gut gemeinte Ratschlag des Auslaufens des Threads lässt sich nicht umsetzen.

Wie es möglicht, den Thread vorzeitig zu beenden? Oder exisitiert eine andere Möglichkeit der Umsetzung?

Vielen Dank für eure Antwort.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
20.02.2007, 12:18 Uhr
ao

(Operator)


Threads von außen zu killen würde ich, wenn es irgendwie geht, vermeiden.

Die zur Verfügung stehende Zeit ist ja bekannt (hier 20 ms). Kannst du die nicht dem Berechnungs-Thread mitgeben? Dann weiß er selber, wann er spätestens abbrechen muss.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
20.02.2007, 14:16 Uhr
~7513
Gast


Hi,
scheitert das saubere Killen von aussen auf grund nicht vorhandener Funktionen?
Was müsste gegeben sein, damit ein sauberes Killen von aussen möglich ist?

Das Übergeben der Zeit an den Thread würde leider den Charakter einer Black Box verletzen, von der nur die Schnittstellen (Eingabe/ Ausgabe) bekannt sind. Es wird daher eine Lösung ohne Eingriff in den Berechnungs-Thread favorisiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
20.02.2007, 15:22 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


"sauberes killen" ist ein widerspruch in sich - sauber beenden bedeutet u.a evtl angeforderter Speicher korrekt aufräumen, Thread von "innen" beenden.

Was du machen könntest wäre das du (wenn die berechnungen z.b in einer schleife o.ä laufen) das du auf eine abbruchbedingung prüfst (die in einem gemeinsamen speicherobjekt liegt) und diese dann von außen setzt und wartest bis der thread dann wirklich terminiert ist.

Ansonsten - warum willst du überhaupt nach 20ms irgendetwas abbrechen?

Achja - wenn du SuspendThread aufrufst und dann TerminateThread - dann wartet der thread trotzdem noch - du musst ihn sozusagen weiterlaufen lassen um ihn von außen zu töten.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
20.02.2007, 17:11 Uhr
~7513
Gast


Hallo,
okay, "sauberes killen" wird zum sauber beenden und das ist nur von "innen" möglich.
Wie verhält es sich beim Debuggen? Ist es dort möglich einfach zu stoppen "ohne Einbußen" (Speicher korrekt aufräumen, etc.)?
Schafft es die Betriebssystem-Ebene einen ausgewählten User-Thread sauber zu beenden? Wenn ja, wie?

Als einzige Möglichkeit kristallisiert sich die Übergabe einer Abbruchbedingung heraus!? Hmm.

Die 20ms sind als Testwert anzusehen. Das eigentliche Ziel ist die Bearbeitung von Videomaterial. Bei 25 Frames pro Sekunde stehen zur Verarbeitung eines Frames (theoretisch) 40ms zur Verfügung. Je nachdem, wie schnell das darunterliegende System ist, wird ein gewisser Fertigungsgrad für die einzelnen Frames erreicht.Es kann vorkommen, dass die Ausgabe des Frames erfolgen muss (Einhaltung der Deadline), obwohl der Algorithmus noch nicht komplett fertig ist. Das heisst, er muss beendet werden, die benötigten Ressourcen freigeben und dann mit dem neuen Frame beginnen. Weil die verschiedenen Algorithmen als Black Box vorliegen, sind Nachbesserungen nicht ohne weiteres möglich.

Danke für den Tipp.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
20.02.2007, 17:21 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Wenn du dein Programm (deinen Prozess) beendest dann wird der komplette Speicher und die verwendeten Resourcen unter einem halbwegs modernen Betriebssystem normalerweise immer korrekt frei gegeben.
Die Probleme wie Speicherlecks und so sind dann also spätestens auch behoben, aber so lange dein Programm läuft ist das halt nicht der Fall wenn du irgendwelche Fehler oder unsauberen Dinge hast. Das heißt wenn du den Thread abschießt und dein Programm danach noch weiter läuft kann es sein das sich da einige Lecks oder nicht sauber geschlossene Resourcen bilden.

Wenn du den Thread bei einem bestimmten Ereignis beenden willst das beim Starten des Threads noch nicht feststeht dann ist die sauberste Methode das über ein Signal oder eine synchronisierte Variable zu lösen. Die setzt du dann in deinem Programm und der Thread prüft regelmäßig ob die gesetzt ist oder nicht.

Einfach so abschießen kannst du den Thread, wie Flo schon gesagt hat, mit TerminateThread, was aber ja nicht schön ist
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
20.02.2007, 22:54 Uhr
~7513
Gast


Hallo,
kommen solche Probleme wie Speicherlecks und so nur bei Windows Systemen vor? Oder auch bei Linux, Mac etc.?
Warum treten solche Probleme auf? Sind die Funktionen unzureichend? Was behindert die Freigabe der Ressourcen bei einem Abschuss von aussen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
21.02.2007, 00:57 Uhr
Blubber2063



Speicherlecks sind Betriebssystem unabhängig und das gilt auch für die Resourcen die du nicht freigibst. Das Betriebssystem kümmert sich nur daraum das nach dem Beenden des Programms wieder alles ordentlich aufgeräumt wird.

Speicherlecks entstehen wenn du Objekt aufm dem Heap ablegst, den Heap Speicher aber nicht freigibst, wenn du ihn nicht mehr benutzt. Oder du hast eben eine Datei, Socket etc. offen und schließt sie nicht wieder.

Wenn du den Thread "extern" beendest, dann musst du zumindest alle von ihm benutzten Resourcen wieder freigeben, d.h. du musst auch wissen was du wieder abräumen musst.

Theoretisch wäre es zwar denkbar(vielleicht auch in irgendeinem OS umgesetzt), das Resourcen nicht nur Prozessen gehören, sondern an Threads gekoppelt sind, dann könnte das OS sie auch nach Beenden des Threads freigeben, aber meines Wissens nach gibts sowas weder unter Unix Systemen noch unter Windows, aber genau weiss ich dass natürlich nicht.

Grundsätzlich tust du gut daran die Resourcen die du belegst auch wieder freizugeben.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
21.02.2007, 21:15 Uhr
~7513
Gast


Hallo,
das mit dem Freigeben der Ressourcen, die ein Thread benutzt, scheint eine verzwickte Sache zu sein. Weil man nicht weiss, was man wieder abräumen musst? Ist es nicht bekannt was ein Thread alles reserviert, um es dann explizit wieder freizugeben?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
21.02.2007, 21:42 Uhr
Blubber2063



Naja es ist dem Betriebssystem normalerweise nur bekannt welche Resourcen ein Prozess besitzt.

Stelle dir doch jetzt mal folgendes Beispiel vor:
Thread A startet Thread B
Thread B öffnet eine Datei
Thread A beendet Thread B
Datei ist noch offen. Man könne jetzt zwar sagen das man ja weiss das B eine Datei öffnet, aber B könnte ja normalerweise die Datei selbst schließen wenn er lang genug läuft, heisst im Klartext, du weisst nicht welche Resourcen der Thread zu der Zeit noch besitzt.

Anderes Beispiel.
Thread A startet Thread B
Thread B reserviert Speicher auf dem Heap, abhängig von seinen Parametern oder Eingaben
Thread A beendet Thread B
woher weisst du jetzt wieviel von dem Speicher freigegeben wurde und wieviel noch reserviert ist.

Du kannst dir das natürlich irgendwo in einer Datenstruktur halten, aber dann kannst du auch genau so gut dem zu beendenden Thread immer wieder Abbruchmöglichkeiten geben, die ihn sauber von außen beenden lassen, z.B. durch setzen einer Variablen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: