Thread endet nich bzw. läuft nich richtig
-
Hallo!
Ich hab ein Problem mit meinem Thread, er beendet nämlich nicht, bzw. läuf nicht richtig. Der Thread soll in einer DB suchen, ob der Dateiname schon drin steht. Solange er läuft is das flag m_ValThreadRuns true, aber das sieht man ja alles im Code. Ist da irgendwo ein Fehler? Ich verstehs nämlich nicht...
// Aufruf: CheckForAlreadyAnalyzed(); Sleep(20); while(m_ValThreadRuns) Sleep(100); // an die Stelle kommt er nie bool cWndMain::CheckForAlreadyAnalyzed() { DWORD ID; CreateThread(NULL, 0, ::CheckProc, NULL, 0, &ID); return true; } DWORD WINAPI CheckProc(LPVOID Param) { g_App->GetMainWnd()->CheckProc(); return 0; } void cWndMain::CheckProc() { m_ValThreadRuns = true; m_ValThreadShouldEnd = false; m_PicAnalyzed = false; CRITICAL_SECTION cs; InitializeCriticalSection(&cs); SetWindowText(m_hStatusBar, "Durchsuche DB..."); try { std::string conn = "Driver={Microsoft Access Driver (*.mdb)};Dbq="; conn += g_App->GetDBFileName(); conn += ";"; size_t p = m_FileName.rfind("\\"); std::string fn = m_FileName.substr(p+1); std::string pn = m_FileName.substr(0, p+1); dtl::DBConnection::GetDefaultConnection().Connect(conn.c_str()); dtl::DBConnection::GetDefaultConnection().CommitAll(); dtl::DBView<sAssocDBSet> view("AR_Bilder"); dtl::DBView<sAssocDBSet>::select_iterator it = view.begin(); for(; it != view.end(); it++) { const sAssocDBSet& set = *it; //if(set.Dateiname == fn && set.Pfad == pn) if(stricmp(set.Dateiname.c_str(), fn.c_str()) == 0 && stricmp(set.Pfad.c_str(), pn.c_str()) == 0 && set.Tiername != "") { EnterCriticalSection(&cs); m_PicAnalyzed = true; char c[256]; sprintf(c, "Bild wurde schon analysiert als %s", set.Tiername.c_str()); SetWindowText(m_hStatusBar, c); m_ValThreadRuns = false; LeaveCriticalSection(&cs); DeleteCriticalSection(&cs); return; } if(m_ValThreadShouldEnd) { EnterCriticalSection(&cs); m_ValThreadRuns = false; LeaveCriticalSection(&cs); DeleteCriticalSection(&cs); return; } } //dtl::DBConnection::GetDefaultConnection().ReleaseConnection(); } catch(dtl::RootException& ex) { MessageBox(m_hWnd, ex.what(), "DB-Fehler", MB_ICONERROR); m_PicAnalyzed = false; } SetWindowText(m_hStatusBar, "Bild wurde noch nicht analysiert!"); m_PicAnalyzed = false; m_ValThreadRuns = false; }
-
Bist du dir sicher, daß du mit dem richtigen Objekt arbeitest? (nicht daß das Hauptprogramm die Member eines anderen Objekts ausliest als der Thread verändert)
Edit: Warum verwendest du eigentlich diese while-Schleife? WaitForSingleObject() ist wesentlich eleganter und resourcenschonender als Busy Waitung.
-
ja, ich verwende das selbe Fenster-Objekt, es gibt ja n ur eins davon

WaitForSingleObject kann ich mir ja mal anschauen

-
WaitForSingleObject ist besser als dein while. dein while produziert nur unnötiges busy waiting. mit WaitForSingleObject lässt der Kernel deinen hauptthread schlafen bis der das ereignis eintritt das ist 1000 mal besser. die handhabung ist in deinem fall sehr simpel einfach WaitForSingleObject( ThreadHandle, INFINITE ) oder wenn du einen timeout haben willst statt INFINITE den timeout wert den du maximal warten willst.