tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
7
ZUGRIFFE
858
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von CodeFatal
    CodeFatal CodeFatal ist offline Mitglied Platin
    Registriert seit
    Oct 2004
    Beiträge
    509
    Hallo,

    ich habe ein nerviges Problem, bei dem ich wieder erwarten in einen Deadlock oder ähnliches verfalle.

    Folgende Situation:
    - MFC Dialogfeldbasierende App
    - CriticalSection zum Locken wird verwendet

    Thread 1:
    - CS1
    - Läuft (auch im Problemfall weiter)
    - Hier nur der Vollständigkeit halber genannt
    Code :
    1
    2
    3
    4
    5
    6
    7
    
    while(1){
        Lock();
        //mach was
        UnLock();
        PostMessage(<zum CDialog>);
        Sleep(50);}
    //Thread wird nie verlassen

    CDialog:
    - Zeigt Elemente an
    - Reagiert auf Messages
    Code :
    1
    2
    3
    4
    5
    6
    
    OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult){
    if(Message == <Von Thread1>){
        Lock();
        //Mach was
        UnLock();
    }}
    - Bei einem Klick auf einen Button wird ein weiterer Thread gestartet

    Thread 2:
    Code :
    1
    2
    3
    4
    5
    6
    
    while(1){//Nur zu Testzwecken um Deadlock zu finden
        Lock();
        //mach was
        UnLock();
    Sleep(2000);//nur zu Testzwecken um Deadlock zu finden}
    return;

    Das ganze Spiel funktioniert solange, bis das Lock in der OnWndMsg(...) gerufen wird und Thread 2 schon im Lock ist.

    Meine Frage: Warum geht das nicht weiter? Theoretisch sollte doch eigentlich der Thread 2 irgendwann durch sein und dann der Rest in OnWndMsg abgearbeitet werden.

    Ich habe bereits eine ähnliche Frage gefunden. Leider hilft die mir nur nicht weiter.
    Auch die Anleitung zu CriticalSection sind mir bekannt.

    Wo übersehe ich was? Ist OnWndMsg(...) nicht asynchron zu meinem Thread?

    Hoffe ihr könnt mir helfen.

    Danke

    P.S.: Ich rufe die Threads mit:
    Code :
    1
    2
    
    AfxBeginThread(...);
    UINT myThread(LPVOID pParam){...}
     
    Grüß die Welt, dann grüßt sie dich!

    Keine Panik, die Titanic ist schon gesunken!

  2. #2
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.169
    Hi.

    Es wäre nicht schlecht wenn du mal etwas konkreten Code lieferst oder zumindest ansatzweise erklärst was die einzelnen Threads machen.

    Ansonsten, bist du ganz sicher, dass // mach was in Thread 2 keine Endlosschleife ist?

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  3. #3
    Avatar von CodeFatal
    CodeFatal CodeFatal ist offline Mitglied Platin
    Registriert seit
    Oct 2004
    Beiträge
    509
    Guten Morgen,

    was ich leider nicht geschrieben habe, ist das der Thread1 eine eigene Critical Section hat, sprich es sind nur Thread 2 und der CDialog gegeneinander verriegelt.

    Von der Vollständigkeit des obigem Pseudocodes bin ich eigentlich überzeugt, da ich immer die gleichen Daten bearbeite.
    Es wird in den jeweiligen Lock() UnLock() Bereichen eine CListCtrl bearbeitet.
    Tritt der Fehler auf, bleibt das System mitten im gelockten Bereich stehen.

    Kann das Problem darin bestehen, das ich im Thread die Membervariable des CListCtrl ändere und der Dialog im Lock verweilt?

    Gruß
     
    Grüß die Welt, dann grüßt sie dich!

    Keine Panik, die Titanic ist schon gesunken!

  4. #4
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.169
    Was siehst du im Debugger?
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  5. #5
    Avatar von CodeFatal
    CodeFatal CodeFatal ist offline Mitglied Platin
    Registriert seit
    Oct 2004
    Beiträge
    509
    Der Läuft im Thread 2 ewig und drei Tage.
    Breakpoint in OnWndMsg VOR Lock() kommt und ab Eintritt in die Lock ists vorbei.

    Habe jetzt nochmal vor das Lock eine while(1)Sleep(400); geschrieben und die reicht schon aus um das System anzuhalten.

    Das spricht aber dafür, das der Thread nicht wirklich eigenständig läuft.

    Gruß
     
    Grüß die Welt, dann grüßt sie dich!

    Keine Panik, die Titanic ist schon gesunken!

  6. #6
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.169
    Welche Threads laufen?

    Wie sieht der Callstack aus?

    Wie sieht der Code konkret aus wo du den Thread startest?
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  7. #7
    Avatar von Endurion
    Endurion Endurion ist offline Mitglied Diamant
    Registriert seit
    Apr 2004
    Beiträge
    2.151
    Wenn du innerhalb eines Windows-Message-Handlers was machst, blockierst du damit die Message-Pump dieses Threads. Alles, was irgendetwas mit einem Fenster in diesem Thread macht, wird blockiert.
     

  8. #8
    Avatar von CodeFatal
    CodeFatal CodeFatal ist offline Mitglied Platin
    Registriert seit
    Oct 2004
    Beiträge
    509
    Hallo,

    wieder was gelernt. War ja schon meine Vermutung nur nicht bestätigt.
    Habe jetzt alles in Threads ausgelagert und nu luppts.

    Danke für die Hilfe.
     
    Grüß die Welt, dann grüßt sie dich!

    Keine Panik, die Titanic ist schon gesunken!

Ähnliche Themen

  1. MFC CDialog und seine Childs
    Von russkij im Forum VisualStudio & MFC
    Antworten: 1
    Letzter Beitrag: 03.12.09, 16:10
  2. MSSQL-PHP-Deadlock
    Von TheVinc im Forum Relationale Datenbanksysteme
    Antworten: 3
    Letzter Beitrag: 14.11.06, 18:27
  3. .NET 05 Outlook 2k Addin - Deadlock
    Von Schwabenprogger im Forum .NET Windows Forms
    Antworten: 2
    Letzter Beitrag: 29.09.06, 09:00
  4. Fehlerbehandlung (MySQL, InnoDB, Deadlock)
    Von Pendergast im Forum Relationale Datenbanksysteme
    Antworten: 0
    Letzter Beitrag: 14.05.06, 13:40
  5. CDialog und Menu
    Von NinjaOne im Forum VisualStudio & MFC
    Antworten: 0
    Letzter Beitrag: 04.08.05, 15:31

Stichworte