tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
4
ZUGRIFFE
1267
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Werner83 Werner83 ist offline Mitglied
    Registriert seit
    Jan 2010
    Beiträge
    15
    Hallo,
    ich starte in meinem Programm eine Methode, in der 5 mal eine weitere Methode in 5 Threads gestartet wird:
    Thread[] tArray = new Thread[5];
    tArray[0] = new Thread(new ThreadStart(prepareImage));
    tArray[1] = new Thread(new ThreadStart(prepareImage));
    tArray[2] = new Thread(new ThreadStart(prepareImage));
    tArray[3] = new Thread(new ThreadStart(prepareImage));
    tArray[4] = new Thread(new ThreadStart(prepareImage));
    tArray[0].Start();
    tArray[1].Start();
    tArray[2].Start();
    tArray[3].Start();
    tArray[4].Start();
    In der Methode werden in einer Endlosschleife Bitmaps aus einer Input-Queue gelesen, bearbeitet und in eine Output-Queue geschrieben. Mit wenig Bitmaps in der Input-Queue und nur 2 Threads funktioniert alles, wenn auch nicht besonders schnell. Sobald ich die Anzahl der Threads erhöhe, oder insgesammt mehr Bitmaps bearbeiten lasse kommt folgende Meldung:

    ContextSwitchDeadlock wurde erkannt.
    Message: Die CLR konnte 60 Sekunden lang keinen Übergang vom COM-Kontext 0x2c32f90 zum COM-Kontext 0x2c331e0 durchführen. Der Thread, der Besitzer des Zielkontexts/-apartments ist, wartet entweder, ohne Meldungen zu verschieben, oder verarbeitet eine äußerst lang dauernde Operation, ohne Windows-Meldungen zu verschieben. Eine solche Situation beeinträchtigt in der Regel die Leistung und kann sogar dazu führen, dass die Anwendung nicht mehr reagiert oder die Speicherauslastung immer weiter zunimmt. Zur Vermeidung dieses Problems sollten alle STA-Threads (Singlethread-Apartment) primitive Typen verwenden, die beim Warten Meldungen verschieben (z.B. CoWaitForMultipleHandles), und bei lange dauernden Operationen generell Meldungen verschieben.

    Was bedeutet die Exception und wie behebe ich den Fehler?
     

  2. #2
    Avatar von Spyke
    Spyke Spyke ist offline Capoeirista
    Registriert seit
    Oct 2002
    Beiträge
    931
    Kommt die Meldung beim Debuggen?
    Zumindest hatte ich diese immer da wenn ich längere Zeit im Debuggen nichts getan habe, diese Meldung kannst du im Studio abschalten.
    Unter: Debug -> Exceptions -> Manage Debugging Assistants -> ContextSwitchDeadlock den Hacken raus
     
    www.iv-interactive.de - Projektewebsite
    WikiParser - aktuelles Projekt

  3. #3
    Werner83 Werner83 ist offline Mitglied
    Registriert seit
    Jan 2010
    Beiträge
    15
    Die Meldung kommt nicht nur beim debuggen, sondern auch wenn ich das Programm laufen lasse. Es wundert mich auch, dass das Programm die Bitmaps nicht schneller schneller bearbeitet, als wenn ich die Methode sequenziell in einer schleife aufrufe.
     

  4. #4
    Avatar von Shakie
    Shakie Shakie ist offline Mitglied Diamant
    Registriert seit
    May 2004
    Ort
    Europa
    Beiträge
    2.048
    Wenn du nur einen Prozessor hast, dann sind mehrere Tasks nicht schneller als ein einziger. Denn woher sollte die Geschwindigkeit kommen? Multithreading ist erst interessant, wenn du auch tatsächlich mehrere Prozessoren hast.
     
    hihi = -h²

  5. #5
    Werner83 Werner83 ist offline Mitglied
    Registriert seit
    Jan 2010
    Beiträge
    15
    Ist richtig, ich nutze aber einen Doppelkern-Prozessoer und die CPU-Auslastung ist bei der sequenziellen Bearbeitung bei 50%, während sie bei der Bearbeitung mit Threads bei 100% liegt.
     

Ähnliche Themen

  1. List von mehreren Threads abarbeiten lassen
    Von stevetc im Forum Algorithmen & Datenstrukturen mit Java
    Antworten: 0
    Letzter Beitrag: 30.09.09, 15:06
  2. Globales Objekt in mehreren Threads verwenden?
    Von Pain-maker im Forum C/C++
    Antworten: 7
    Letzter Beitrag: 11.06.09, 21:54
  3. [C] Liste sortieren. Threads verwenden?
    Von KeDaiv im Forum C/C++
    Antworten: 9
    Letzter Beitrag: 02.11.08, 00:13
  4. SWT mehrere Threads verwenden
    Von bigJ01 im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 7
    Letzter Beitrag: 28.02.05, 09:44
  5. Methode von mehreren Threads verwenden
    Von michaelu im Forum .NET Archiv
    Antworten: 1
    Letzter Beitrag: 22.01.04, 13:04

Stichworte