MFC Multithread & this Zeiger

JoachimJogi

Mitglied
Hallo,

ich habe ein Problem beim Arbeiten mit mehreren Threads/Dialogen. Da ich eine sehr große Datei einlese, möchte ich dem Benutzer die Möglichkeit zum Abbrechen geben.
Hierzu erstelle ich einen Arbeitsthread (thrFunction), der die Datei einliest und im MainThread wird ein modaler Dialog (Mit Cancel Button) angezeigt.
Jetzt gibt es folgende 3 Fälle
- Datei ist eingelesen, modaler Wartedialog wird beendet
- Benutzer drückt Abbrechen Button (wartedialog beendet sich) => arbeitsthread beendet sich
- beim einlesen tritt ein fehler auf => wartedialog wird beendet

Folgenden Code habe ich mir überlegt:
Leider ist hier irgendwo eine RaceCondition, da alle 4-5x eine Assertion auftritt. Das Problem tritt immer dann auf, wenn "eigentlich alles richtig nach Plan" läuft, aber dann greift das EndDialog vom Workthread ins Leere.
Das komische dabei ist, dass der WaitDialog zu diesem Zeitpunkt noch vorhanden ist.

Ist es möglich, dass hier ein Problem auftritt, nur weil ich mit 2 Threads gleichzeitig auf dasselbe Dialogobjekt zugreife? (Ich übergebe einen this Zeiger)

Vielen Dank!

Code:
class
{
   CWait m_wait; //wait dialog
   BOOL m_bFlag; // boolean flag
   ...
}



//// MAIN THREAD, MAIN DIALOG
   m_bFlag=true;
   CWinThread* pThread = AfxBeginThread(thrFunction, this); 
   if(IDOK==m_Wait.DoModal())
   {
      // alles ok, datei wurde eingelesen
   }
   else
   {
      m_bFlag=false;
      // Cancel Button wurde gedrückt ABBRUCH signalisieren durch m_bFlag
      // Oder Fehler beim Einlesen
   }



/// Work Thread
UINT CThreadTest::thrFunction(LPVOID pParam) 
{ 
  CThreadTest* pDlg = (CThreadTest*) pParam; 

  pDlg->thrRun(); 
  return 0; 
} 


void CThreadTest::thrRun() 
{ 
   while(1)
   {
      if(!m_bFlag)
         break;


      // do something
      if(fehler)
         m_Wait.EndDialog(IDCANCEL);

      if(finish)
         break;
   }

   if(m_bFlag)
   {
      // datei ist komplett eingelesen, dialog mit ok beenden
      m_Wait.EndDialog(IDOK);
   }
}
 

Neue Beiträge

Zurück