Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Threads zählen

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
08.04.2005, 14:34 Uhr
~ThreadProblem
Gast


Ich möchte gerne eine Aufgabe von 50 Threads erledigen lassen. Wie kann ich zählen, wieviel Threads gerade laufen, damit der Hauptthread en Ablauf steuern kann (falls 50 Threads schon aktiv sind, keine neuen mehr starten, falls weniger als 50, neue Threads starten.) Ich hab es schon mit einer int-Variable probiert, die in dem Projekt global definiert ist. Jedesmal wenn ein Thread gestartet wird, wird die Variable mit dem Befehl Zaehler++ um eins erhöht, bei jedem Beenden mit dem Befehl Zaehler-- um eins verringert. Die Variable hat, obwohl die Zeile abgearbeitet wird IMMER(!) den Wert 0, so das das Programm meistens abstürzt wenn über 1000 gleichzeitige Threads laufen. By the Way: ich starte meine Threads mit BeginThread und nicht mit TThread.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
08.04.2005, 14:36 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


ohne code kann ich dir nicht sagen was du falsch gemacht hast...
normalerweise hast du doch sowieso für jeden thread den du startest einen HANDLE.. wenn du dir diese in einer containerklasse merkst weisst du doch sowieso wieviele gerade am start sind...
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 08.04.2005 um 14:37 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
08.04.2005, 14:42 Uhr
ao

(Operator)



Zitat von ~ThreadProblem:
Jedesmal wenn ein Thread gestartet wird, wird die Variable mit dem Befehl Zaehler++ um eins erhöht, bei jedem Beenden mit dem Befehl Zaehler-- um eins verringert. Die Variable hat, obwohl die Zeile abgearbeitet wird IMMER(!) den Wert 0

Muss ein Programmierfehler sein, der mit den Threads nix zu tun hat.

Hast du vielleicht eine lokale Variable Zaehler, oder ein Klassenmember oder irgendwas, das den globalen Zaehler verdecken kann?

Ansonsten: Show your code.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
08.04.2005, 16:25 Uhr
Spacelord
Hoffnungsloser Fall


Ne Semaphore ist ne geeignete Methode die Threads zu verwalten.Mit der globalen Variable und ++ -- ist kritisch weil die Operatoren auch nicht atomar sind.
Hat aber nichts mit deinem Problem zu tun.Da läuft was anderes schief.

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
08.04.2005, 20:29 Uhr
9ball




Zitat von ao:

Muss ein Programmierfehler sein, der mit den Threads nix zu tun hat.


nene, das ist ein programmierfehler, der mit threads _doch_ was zu tun hat.
1. die variable muss als 'volatile' deklariert werden
2. zugriff auf die variable muss synchronisiert werden (mutex, critical section o.ä.)
--
one for all and all for one
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
08.04.2005, 20:37 Uhr
Spacelord
Hoffnungsloser Fall


Zur Not würde es auch reichen InterlockedIncrement und InterlockedDecrement auf die int Variable anzuwenden.
Mit deiner volatile Vermutung wirst du warscheinlich Recht haben.

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
08.04.2005, 20:46 Uhr
9ball




Zitat von Spacelord:

Zur Not würde es auch reichen InterlockedIncrement und InterlockedDecrement auf die int Variable anzuwenden.


entweder so, oder man fragt direkt das system wieviele threads der prozess schon hat und macht bei 51 schluss. (geht irgendwie mit 'NtQuerySystemInformation()', steht in 'windows native api reference')
--
one for all and all for one
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
08.04.2005, 20:51 Uhr
Spacelord
Hoffnungsloser Fall



Das wäre aber wie mit Kanonen auf Spatzen schießen .
Durch einen glücklichen Zufall bin ich in nem anderen Forum an den Original MS Header gekommen,aber ohne den ist die Arbeit mit NTQuerySystemInformation doch sehr mühsam.

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
08.04.2005, 21:03 Uhr
9ball




Zitat von Spacelord:

Das wäre aber wie mit Kanonen auf Spatzen schießen .


aber nein. das os hat diese informationen sowieso ständig parat. mit 'NtQuerySystemInformation' werden sie einfach abgerufen. das ist wesentlich einfacher (und weniger fehleranfällig) als einen eigenen threadzähler zu implementieren
--
one for all and all for one

Dieser Post wurde am 08.04.2005 um 21:03 Uhr von 9ball editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
09.04.2005, 09:20 Uhr
Spacelord
Hoffnungsloser Fall



Zitat von 9ball:
aber nein. das os hat diese informationen sowieso ständig parat. mit 'NtQuerySystemInformation' werden sie einfach abgerufen. das ist wesentlich einfacher (und weniger fehleranfällig) als einen eigenen threadzähler zu implementieren


Nichts für ungut,aber das möchte ich doch bezweifeln.
Um mit NtQuerySystemInformation zu arbeiten musst du erstmal nen paar Strukturen deklarieren(wegen des nicht vorhandenen Headers) dann musst du nen Funktionspointer anlegen und mit GetProcAdress die Adresse aus ntdll.dll besorgen.
Und wenn du die Anzahl der Threads so ermittelst musst du den ganzen Kram doch trotzdem noch synchronisieren!?Also von weniger fehleranlällig kann da ja wohl keine Rede sein.
Also ich bleib dabei dass da ne Semaphore(die genau dafür gedacht ist!) dass Mittel zum Zweck ist.

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.

Dieser Post wurde am 09.04.2005 um 09:21 Uhr von Spacelord editiert.
 
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: