# Problem mit Streßtestprogramm



## my (13. Sep 2004)

hallo Leute,

Ich habe richtig grosßes Problem: Ich schreibe ein [Stress]Testprogramm welches die Alltags-Benutzung eines Datenbank darstellt. Darin baue ich viele viele Threads, jeder Thread baut eine Verbindung zum Server auf ... führt bestimmte Statements aus ... und schließt die Verbindung wieder (Jeder Thread ist quasi ein Datenbank-Nutzer). Dann protokolliere ich alle Aktionen der Threads (in eine Tabelle) um später das Verhalten der Datenbank zu analysieren.  Das Programm soll eine Woche laufen und Protokoldaten sammeln.... leider läuft das Programm nur ca. 2 Stunden und friert dann ein. Ich bin total verzweifelt. 

Hier die Hauptattraktion:

```
// jeder thread simuliert 1 User		
try {
        // Anzahl der maximal parallele Threads
	int maxThread=20;				

         // ein Vektor von db. db ist meine Klasse worin ich dynamische die SQL-Statement zusammenbaue, Verbindung auf und abbaue usw... 
	db mydb[] = new db[maxThread];

        // Anzahl der Paralle Threads zufällig erzeugen
	Random r = new Random();
	int anzThreads=0;

        // Wenn ein Thread ins Leben gerufen wird ... registriert er sich bei d. Threadmanager ... wenn er abgearbeitet ist ... dann abmelden
	ThreadManager tm = new ThreadManager();

	while(true){
		anzThreads=r.nextInt(maxThread)+1;	// Anzahl der Threads zufällig erzeugen
		for(int i=0; i<anzThreads; i++){
			mydb[i]= new db(DBMS,tm);              // Die Threads initialisieren und auf Start drücken
			mydb[i].start();	
		}
				
		// Wenn aktuelle Anzahl der Threads <= 5 ........ dann wieder stressen mit eine neue "Nutzer Welle"!
		while(true){
			for(int i=0; i<=1000000; i++){}             // Bremsschleife damit die Anzahl der Threads nicht ausartet
			if(tm.anzThread()<4){                          // Wenn nur noch 4 Threads lebt, dann wird diese Schleife abgebrochen ...
				System.out.println("NEW WAVE!!!"); // somit werden wieder neue Threads initialisert und ausgeführt
				break;
			}
		}				
	}			
} catch (Exception e) {
        // In dieser Catchblock kommt das Programm bisher nie
       System.out.println("Thread error: "+e);
}
```

BITTE HELFE MIR....ICH BIN EUCH DAFÜR ZUR EWIGEN DANK VERPFLICHTET


----------



## P3AC3MAK3R (13. Sep 2004)

Erst Boardregeln lesen, dann posten:



> Aussagekräftige Titel verwenden! Es nervt nur, wenn ihr z. B. schreibt "Suche Hilfe". Eine gute kurze Beschreibung eures Problems hilft euch viel eher weiter.


----------



## Bleiglanz (13. Sep 2004)

was heisst einfrieren?

werden alle Connections sicher wieder geschlossen?

Fehlermeldungen?

lass mal ein bisschen mitprotokollieren damit du siehst, was so abläuft?

was wird in "new db(DBMS,tm)" denn gemacht??


----------



## my (13. Sep 2004)

*was heisst einfrieren? *
Die Aktionen von den Threads werden ja in eine DB-Tabelle gespeichert. Jeder Zeile diese Tabelle spiegelt der Verlauf einer Transaktion wieder. Die Tabelle hat folgende Spalten: 
ABFRAGETYP 
ABFRAGE 	
ANZZEILEN 	
ZEITVERBRAUCH 	
ANZCON 	
ANZSCHREIB 	
ANZLESEN 	
ANZTABDS 	
TABNAME 	
ANZANWEISUNGEN 	
SYSTEMMELDUNG 	
AUSFUEHRUNGSZEIT
Die Spalte Ausführungszeit speichert den TimeStamp der Ausführung d. jeweiligen Threads. An Hand der Ausfuehrungszeit erkenne ich von wann bis wann mit der Tabelle was geschieht. Einfrieren heisst: Es wird nach ca.2h keine weitere Datensaetze in diese Tabelle mehr aufgenommen. 

*werden alle Connections sicher wieder geschlossen?*
Ja. Mit der Funktion isAlive() prüfe ich ob die Connection noch am Leben sind und mit stop() i.V.m isInterrupted() werden sie gekillt.

*Fehlermeldungen?
*Nein! 

*lass mal ein bisschen mitprotokollieren damit du siehst, was so abläuft? *
wie meinst du das?

* was wird in "new db(DBMS,tm)" denn gemacht?? *
Da wird eine Instanz vom typ db angelegt. db(String NameDesDBMS, TransactionManager tm) ist der Konstructor meiner db Klasse![/b]


----------



## apfelsine (13. Sep 2004)

Was ist mit dem Transaktionsmodus?
Bist du im Dirty Read oder in welchem Modus?
Könnte es sein, das "eine" Transaktion auf eine Tabelle zugreift, die 
gerade gesperrt worden ist ?
Bei MS SQL Server friert unter diesen umständen die ganze Anwendung ein.
Vielleicht blockieren sich deshalb deine Threads gegenseitig und es passiert nix mehr.
Was ist mit Deadlock? Welches DBMS benutzt du? MySQL?
Ich weiß nicht wie gut die Deadlock Routinen bei denen sind.


----------



## Bleiglanz (13. Sep 2004)

>>wie meinst du das? 

gelegentlich ein System.out.println() um ein paar Statusinformationen auszugeben...

Schau doch auch mal ins Logfile der DB, die besseren Datenbanken haben auch gute Tools dabei, um verschiedene parameter mitzuprotokollieren


----------



## my (13. Sep 2004)

* Was ist mit dem Transaktionsmodus? 
Bist du im Dirty Read oder in welchem Modus? [\b]
Ich habe alles durch probiert
read uncommitted
read committed
repeatable read
nur serializeable nicht

 Könnte es sein, das "eine" Transaktion auf eine Tabelle zugreift, die
gerade gesperrt worden ist? Bei MS SQL Server friert unter diesen umständen die ganze Anwendung ein. Vielleicht blockieren sich deshalb deine Threads gegenseitig und es passiert nix mehr. Was ist mit Deadlock? [\b]
ja, das ist das was ich anstrebe. Wenn ein Deadlock eintritt, kommt doch eine Meldung oder? SQL-Exception o.ä.  Ein DBMS kann doch nicht einfach still und leise verabschieden wenn ein Deadlock eintritt. Der Deadlock wird aufgelöst und irgendeine TA muss zurück gerollt werden.


Welches DBMS benutzt du? MySQL?
Ich weiß nicht wie gut die Deadlock Routinen bei denen sind.
oracle 10g*


----------



## apfelsine (13. Sep 2004)

> * Könnte es sein, das "eine" Transaktion auf eine Tabelle zugreift, die
> gerade gesperrt worden ist? Bei MS SQL Server friert unter diesen umständen die ganze Anwendung ein. Vielleicht blockieren sich deshalb deine Threads gegenseitig und es passiert nix mehr. Was ist mit Deadlock? [\b]
> ja, das ist das was ich anstrebe. Wenn ein Deadlock eintritt, kommt doch eine Meldung oder?
> *


*
Tja, das ist eine Sache, die ich immer schonmal ausprobieren wollte. Ich kann dir nur sagen,
was der MS SQL Server macht. Er beendet die Transaktion, die zu einem Deadlock führen würde
mit einer Exception. und einem entsprechenden Rollback
Probiere es doch einfach mal im SQL Plus Interface aus. Starte eine Transaktion und greif auf ne Tabelle zu, ohne 
die Transaktion zu beenden und mach ein neues Interface auf, in der du noch eine Transaktion startest
und führe die zwei Transaktionen so zusammen, das ein Deadlock entstehen würde.
Dann müßtest du schon zu sehen bekommen was Oracle damit macht.

Interessant wirds dann mit mehreren ineinander verschachtelten Transaktionen, und zwar die wo 
dann Transaktion a auf x wartet und x auf w ...und so weiter.... b auf a. Dann könnte es sein, das sogar
ein Oracle damit Probleme hat. Ich meine mich zu entsinnen, das keine Graphenkontrolle existiert.

Aber das war das Deadlock-Handling. Was ich mit einfrieren meine ist, das eine Transaktion auf die andere
wartet, das sie fertig wird und noch kein "echter" Deadlock entstanden ist. In dem Fall kann es sein,
das sich die Wartezeiten extrem verlängern, weil sich die Transaktionen gegenseitig behindern.
Deswegen sollen Transaktionen so kurz wie möglich sein.




			SQL-Exception o.ä. Ein DBMS kann doch nicht einfach still und leise verabschieden wenn ein Deadlock eintritt. Der Deadlock wird aufgelöst und irgendeine TA muss zurück gerollt werden.


Welches DBMS benutzt du? MySQL?
Ich weiß nicht wie gut die Deadlock Routinen bei denen sind.
oracle 10g
		
Zum Vergrößern anklicken....


Also Oracle kann sowas ganz gut eigentlich
aber was ist mit deiner Anzahl der Threads? woher weißt du das die nicht irgendwann größer sind als
der integer? Und dann wärs ganz interessant bei wieviel lebenden Threads du denn nach 2 Stunden bist.
Das solltest du mal ausgeben lassen.
Ich kenne die Random Fctn jetzt nicht, aber ich kann 
hier:
 for(int i=0; i<=1000000; i++){}             // Bremsschleife damit die Anzahl der Threads nicht ausartet

nicht erkennen wo da was gebremst wird. oder hast du den code zwischen den klammern
weggelassen?
und das if ( tm.anzThread...) 
oder fehlt hier auch einfach Code?

gruß
apfelsine*


----------



## my (13. Sep 2004)

*Also Oracle kann sowas ganz gut eigentlich
aber was ist mit deiner Anzahl der Threads? woher weißt du das die nicht irgendwann größer sind als
der integer? Und dann wärs ganz interessant bei wieviel lebenden Threads du denn nach 2 Stunden bist.
Das solltest du mal ausgeben lassen.*
Das ganze habe ich mir so gedacht: Jeder Thread der ins Leben gerufen wird meldet sich bei der Klasse tm an (Transactionsmanager). Das geschieht mit der Methode tm.addThread() welches als erstes in d. run() aufgerufen wird! Das kann man so machen weil die Threads eine Instanz vom tm bekommen haben. Der letzte Befehl in der run ist ein removeThread(). mit anzThread gebe ich die aktuelle Anzahl der Threads aus! Ganz zum Schluss bevor der Thread uns verlässt, wird dann der Erfolg o. Misserfolg der Transaktion per insert in die log-Tabelle geschrieben. Das funktioniert ganz gut .... aber leider nur wenige Stunden

*Ich kenne die Random Fctn jetzt nicht, aber ich kann
hier:
for(int i=0; i<=1000000; i++){} // Bremsschleife damit die Anzahl der Threads nicht ausartet
nicht erkennen wo da was gebremst wird. oder hast du den code zwischen den klammern
weggelassen?
*
hmmm... ich habe mir gedacht dass ein CPU schon eine Sekunde braucht um von 1 bis 1Mio zu zählen.

*und das if ( tm.anzThread...)
oder fehlt hier auch einfach Code?
*
Die Methode liefert mir die aktuelle Anzahl der lebenden Threads!

gruß
apfelsine


----------



## apfelsine (13. Sep 2004)

Ich denke, du mußt dir unbedingt mal ausgeben lassen, wieviele Threads da
aktiv sind zu dem Zeitpunkt wo das Ding einfriert. Ich vermute das du das
System schlichtweg überlastest.
Dann ist nicht ganz klar, wieso du keine Timer-Funktion benutzt, wenn du deine Schleife
einen Moment anhalten willst.
Ausserdem sieht es so aus, als sei der Anzahl der Threads keine Grenze gesetzt.
Das ist so oder so nicht gut.
Du kriegst mit der entsprechenden Anzahl Anfragen irgendwann das fetteste System
mit dem fettesten Server zum Stillstand.
Hinzu kommt, das es da auch noch den Flaschenhals physikalisches Medium genannt Festplatte gibt,
auf die hin und wieder geschrieben wird. Das Verhalten des DBMS hängt dann
ja auch davon ab, ob das Ding eine verteilte Datenbank ist oder ob ein einziger armer Server
deine ganzen Threads schlucken muss.
Sag mal bescheid wenn du weißt wie Oracle auf einen Deadlock reagiert. das würd mich mal interessieren.


----------



## Bleiglanz (14. Sep 2004)

gibts nicht eine Funktion wait(long zeitInMillis)? Hä?  sogar in java.lang.Object???

Zusatzfrage: Wie lange laufen den deine Threads, jeder baut eine Connection auf, macht was und schliesst die Connection wieder - wozu brauchst du da noch den Transaktionsmanager..?

Bleibt deine Log-Tabelle eigentlich immer offen? Du schreibst zwei Stunden lang rein? Wann und wo gibts ein commit()?


----------



## Guest (14. Sep 2004)

*gibts nicht eine Funktion wait(long zeitInMillis)? Hä? sogar in java.lang.Object??? *
ja das werde ich jetzt mal nutzen

*Zusatzfrage: Wie lange laufen den deine Threads, *
Es ist unterschiedlich. Ich simuliere ja das Nutzerverhalten. Jeder Thread führt eine Transaktion aus, wobei die kleinste Transaktion ja schon ein einfache Insert ist.

*jeder baut eine Connection auf, macht was und schliesst die Connection wieder - wozu brauchst du da noch den Transaktionsmanager..?*
Da jeder Thread beim Connectionaufbau sich beim TM anmeldet (und beim Connectionabbau wieder abmeldet) ... da wird also eine Variable hoch oder runtergezählt. Somit weiss ich immer genau wie viel Threads gerade aktiv sind. Sicherlich gibt es eine elegantere Lösung ... aber die kenne ich nicht 

*Bleibt deine Log-Tabelle eigentlich immer offen? Du schreibst zwei Stunden lang rein? Wann und wo gibts ein commit()?*
Naja, Jeder Thread baut eine Connection auf, setz autocommit auf FALSE ... mache was ... und dann commit() .... und erst dann wird die connection wieder geschlossen


----------



## my (14. Sep 2004)

*Ich denke, du mußt dir unbedingt mal ausgeben lassen, wieviele Threads da
aktiv sind zu dem Zeitpunkt wo das Ding einfriert. Ich vermute das du das
System schlichtweg überlastest.*
ja ich weiss doch ganz genau wieviele Threads in d. Zeitpunkt sind. Es ist doch alles in meine Log-Tabelle aufgezeichnet. Scroll mach hoch und schaut dir mal die Struktur meine Tabelle an. ... das ist das Feld anzCon enthält die Anzahl der aktive Threads.

*Dann ist nicht ganz klar, wieso du keine Timer-Funktion benutzt, wenn du deine Schleife
einen Moment anhalten willst.*
Weil mir zu dem Zeitpunkt nichts Besseres einfiel  eine Schleife bietet sich als bequeme Alternative an
*
Ausserdem sieht es so aus, als sei der Anzahl der Threads keine Grenze gesetzt.
Das ist so oder so nicht gut.
Du kriegst mit der entsprechenden Anzahl Anfragen irgendwann das fetteste System
mit dem fettesten Server zum Stillstand.*
Doch, die maximale Anzahl der lebenden Threads sind gesetzt. Ich frage ja immer wieder ab wieviele noch am Leben sind ... erst dann lasse ich eine neue Thread-Welle raus! Das Abfragen der lebenden Threads geschieht mit der Methode anzThreads (vom Transaktionsmanager eine Methode)

*Hinzu kommt, das es da auch noch den Flaschenhals physikalisches Medium genannt Festplatte gibt,
auf die hin und wieder geschrieben wird. Das Verhalten des DBMS hängt dann
ja auch davon ab, ob das Ding eine verteilte Datenbank ist oder ob ein einziger armer Server
deine ganzen Threads schlucken muss.*
Da hast du völlig recht. Aber mein Ziel ist ja einen Stresstest durch zu führen. Ich will ja das System zum Schwitzen bringen. Das kann doch nicht sein daß es schon nach 2h tod ist. 

*Sag mal bescheid wenn du weißt wie Oracle auf einen Deadlock reagiert. das würd mich mal interessieren. *
ja mache ich. 
hmmmm.... heisst das jetzt du lässt mich allein mit meinem Problem  ???:L


----------



## my (14. Sep 2004)

*Sag mal bescheid wenn du weißt wie Oracle auf einen Deadlock reagiert. das würd mich mal interessieren. *

Da ist es ja schon: Ich führe folgende SQL-Statement auf meine Log-Tabelle aus 

select systemmeldung from stresslog where systemmeldung like '%deadlock%'

und bekomme diese:

ORA-00060: deadlock detected while waiting for resource


----------



## apfelsine (14. Sep 2004)

nein natürlich nicht 
ich hab nur nicht die Zeit das jetzt auszuprobieren und
es würde mich trotzdem interessieren

Also das:
 if(tm.anzThread()<4){

ist alles - aber keine BEGRENZUNG

Da sagst du doch nur, wenn weniger als 4 threads leben mach neue Welle
auf der anderen Seite aber erhöhst du immer die Threadanzahl. Vergessen hab ich dabei natürlich,
das auf der anderen Seite auch Threads beendet werden.
Trotzdem, du erhöhst immer die Anzahl ohne eine Obergrenze und erwartest aber
das das ewig so weitergeht. Ich kenne jetz nicht die Anzahl der aktiven Threads
wenn das System einfriert. Schreib doch mal wieviele es sind.

Du sagst du weißt wieviele Threads laufen zu dem Zeitpunkt wo das system einfriert...
und? Wieviele sind es?




> Dann ist nicht ganz klar, wieso du keine Timer-Funktion benutzt, wenn du deine Schleife
> einen Moment anhalten willst.
> Weil mir zu dem Zeitpunkt nichts Besseres einfiel icon_smile.gif eine Schleife bietet sich als bequeme Alternative an


Das ist IMHO keine alternative. Ich würd eine Timer Funktion da reinsetzen


Du schreibst

```
db mydb[] = new db[maxThread];

aber ich sehe nicht wo das hier eine Begrenzung darstellt
while(true){
      anzThreads=r.nextInt(maxThread)+1;   // Anzahl der Threads zufällig erzeugen
      for(int i=0; i<anzThreads; i++){
```


----------



## Guest (14. Sep 2004)

*aber ich sehe nicht wo das hier eine Begrenzung darstellt*


```
while(true){

      anzThreads=r.nextInt(maxThread)+1;   // Anzahl der Threads zufällig erzeugen
      for(int i=0; i<anzThreads; i++){
         mydb[i]= new db(DBMS,tm);              // Die Threads initialisieren und auf Start drücken
         mydb[i].start();   
      }
            
      // Wenn aktuelle Anzahl der Threads <= 5 ........ dann wieder stressen mit eine neue "Nutzer Welle"!
      while(true){
         for(int i=0; i<=1000000; i++){}             // Bremsschleife damit die Anzahl der Threads nicht ausartet
         if(tm.anzThread()<4){                          // Wenn nur noch 4 Threads lebt, dann wird diese Schleife abgebrochen ...
            System.out.println("NEW WAVE!!!"); // somit werden wieder neue Threads initialisert und ausgeführt
            break;
         }
      }            
   }
```

Das Programm bleibt solange in der innere while(true) Schleife stecken bis die Anzahl der lebenden Threads weniger als 4 sind. Erst dann wird er durch break die innere Schleife verlassen und kommt oben in die for-schleife rein ... wo er erneut Threads ins Leben ruft. Er ruft nicht unbegrenzt Threads ins Leben sondern nur bis anzThreads.

*Du sagst du weißt wieviele Threads laufen zu dem Zeitpunkt wo das system einfriert...
und? Wieviele sind es? *
ja ich habe natürlich mehr mals probiert. Die höchste Anzahl der lebenden Threads wo das Ding einfriert war 44. Sonst so um die 20.
Ich weiss nun nicht genau wo das Problem liegt, ob das nun Deadlocks sind oder ob das Problem in den JDBC-Treibern liegt.


----------



## apfelsine (14. Sep 2004)

dann tippe ich auf deadlocks


----------



## apfelsine (14. Sep 2004)

schick mir doch mal deinen code...
ich würd mir den gerne mal in ruhe anschauen
meine mail ist:

appelsine at gmx punkt de


----------



## my (14. Sep 2004)

*dann tippe ich auf deadlocks*
Aber Oracle gibt doch was bei deadlocks aus. Es wird eben eins von den TA abgebrochen damit alles wieder fließt


----------



## my (14. Sep 2004)

*schick mir doch mal deinen code...
ich würd mir den gerne mal in ruhe anschauen
meine mail ist:

appelsine at gmx punkt de*

Ich bin der Meinung der Code bring dir nichts weil:
a) Schlecht Kommentiert
b) Du hast nicht die notwendige Tabellen, TEst-Daten, Berechtigungen usw... um das mal laufen zu lassen ... der Aufwand wäre für dich zu groß.


----------



## apfelsine (14. Sep 2004)

> Du hast nicht die notwendige Tabellen, TEst-Daten, Berechtigungen usw... um das mal laufen zu lassen ... der Aufwand wäre für dich zu groß.



ich denke nicht, das ich das brauche

mir gings um den code in start() nicht um die datenbank.

stehen denn deadlocks drin in deinem log?
auch wenn das ganze dynamisch erzeugt wird, gibts doch bestimmt ein Muster das entsteht.Denn
echte Zufallszahlen gibts im Computer nicht. Vielleicht kannst du daraus 
etwas erkennen. Ich meine eine bestimmte konstellation von threads
oder so, die sich dann evtl gegenseitig blockieren


----------



## my (14. Sep 2004)

*stehen denn deadlocks drin in deinem log?*
ja, schau noch mal auf Seite 1 rein. Oracle löst Deadlocks auf!

*auch wenn das ganze dynamisch erzeugt wird, gibts doch bestimmt ein Muster das entsteht.Denn
echte Zufallszahlen gibts im Computer nicht. Vielleicht kannst du daraus
etwas erkennen. Ich meine eine bestimmte konstellation von threads
oder so, die sich dann evtl gegenseitig blockieren*
ja ich weiss, es ist nur Pseudo-Zufall. Um bestimmte Muster zu erkennen sind zu wenig Daten vorhanden. Wie dem auch sei ... Deadlocks wird doch aufgeloest! Tippst du immer noch drauf daß das Problem am Deadlock liegt?  ???:L


----------



## apfelsine (14. Sep 2004)

Deadlocks können nur dann aufgelöst werden, wenn sie als solche
vom System erkannt werden.
Üblicherweise benutzen auch solche Systeme nicht den aufwendigen Algorithmus
von Djkstra und wie sie alle heißen zum auffinden von kreisen in einem Graphen,
sondern lösen das auf eine einfachere weise. Wenn die Threads besonders
komplex verschachtelt werden, kann es also trotzdem passieren, das
ein Deadlock auftritt, der als solcher vom system nicht erkannt wird.
Du kannst das versuchen zu kompensieren, indem du die Wartezeit für
einen Thread reduzierst. Dh. ein Thread der x minuten oder sekunden gewartet
hat, wird dann automatisch terminiert, als wäre ein Deadlock passiert.
indem du diese wartezeit runtersetzt, kannst du
zumindest feststellen, ob denn die ursache nicht erkannte deadlocks sind.
Wenn das System dann trotzdem einfriert, *muß* die ursache in deinem Programm
liegen.


----------



## apfelsine (14. Sep 2004)

Dirty Read macht dann bestimmt keine Probleme :-D
das ist aber keine Lösung *gg*


----------



## apfelsine (14. Sep 2004)

was mir noch einfiel.
du könntest parallel ein normales text logfile schreiben,
einfach um festzustellen, ob denn deine Anwendung an sich noch lebt,
oder ob DIE eingefroren ist....oder einfach in die Kommandozeile mehr
Ausgaben rein, sodass du siehst ob noch was in deiner Anwendung passiert...
oder so
Weiß nicht ob du nur festgestellt hast das nix mehr in die DB geschrieben
wird oder ob du auch festgestellt hast das die Anwendung nix mehr macht
und wenn ja ab welcher "Stelle".


----------



## my (14. Sep 2004)

weiss du was... ich habe eine Idee.
Ich mache nur Lese-TA. D.h Deadlocks sind somit ausgeschlossen. Wenn das Ding einfriert dann liegt es nicht am Deadlocks.  :lol: 
oder? ???:L


----------



## apfelsine (14. Sep 2004)

nee dann gibt es keine Deadlocks

beobachte vielleicht auch mal die Speichernutzung - 
also ich meine den Arbeitsspeicher vom BS, wenn dein programm läuft


----------



## my (15. Sep 2004)

ich habe neulich nur Lese-Transanktionen losgeschickt. Das Ding bliebt auch irgendwann stecken. hmmmmm ...... dann weiss ich jetzt das ich der Fehler irgendwo im Programm suchen muss... wenn ich es gefunden habe sage ich bescheid. HS zu beobachten ist natürlich eine sehr gute Idee..... nur meinem Rechner ist auch so bei den normalen Anwendungen schon um die 80% belegt  :cry:


----------



## apfelsine (15. Sep 2004)

das macht nix.
wenn du irgendwo vergessen hast speicher wieder freizugeben,
dürfte dir das trotzdem an dem stetig steigenden Speicherbedarf auffallen


----------



## Bleiglanz (15. Sep 2004)

wenn mehr als 4 Threads irgendwie hängenbleiben, dann friert dein Programm ein - das ist wohl klar.

Lass doch mal zu debug-zwecken ausgeben, ob alle Threads auch korrekt terminieren...


----------

