[GELÖST] Klassen / Instanzen / Threads pt.2 | Einfach zu rekonstruieren
-
Hallo,
ich habe das Problem jetzt deutlich abgespeckt.
Das Problem liegt definitiv am Multithreading.So könnt Ihr das Problem wesentlich einfacher nachvollziehen.
Vielen Dank für eure Hilfe!
P.S.:
Sorry für den neuen Thread aber der alte war schon vor mir mit Informationen voll, die nicht zielführend sind.Hier der Code:
bool Ctest_1Dlg::test_anything() { LARGE_INTEGER lStart, lEnd, lFreq; QueryPerformanceFrequency(&lFreq); QueryPerformanceCounter(&lStart); // Weitere Variablen und Arrays int THREAD_COUNT = 80; HANDLE *hThreads = new HANDLE[THREAD_COUNT]; CWinThread **cThreads = new CWinThread*[THREAD_COUNT]; // Threads starten for(int i=0; i<THREAD_COUNT; i++) { cThreads[i] = ::AfxBeginThread(test_worker,this, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED); cThreads[i]->m_bAutoDelete = FALSE; hThreads[i] = cThreads[i]->m_hThread; cThreads[i]->ResumeThread(); } // Alle Threads wurden gestartet. Jetzt wird gewartet TRACE("\r\nAlle Threads gestartet. WARTE JETZT!"); ::WaitForMultipleObjects(THREAD_COUNT,hThreads,TRUE,INFINITE); // Auräumen delete[] hThreads; // Threads manuell löschen, da m_bAutoDelete=FALSE for( i=0; i<THREAD_COUNT; i++ ) delete cThreads[i]; delete[] cThreads; QueryPerformanceCounter(&lEnd); int ms=((lEnd.QuadPart - lStart.QuadPart) * 1000) / lFreq.QuadPart; CString time_dif; double delta_t = (double)(ms)/1000; time_dif.Format("\r\nBerechnet in: %.3f Sek.\r\n",delta_t); TRACE(time_dif); TRACE("FERTIG!!!\r\n"); return true; } UINT Ctest_1Dlg::test_worker(LPVOID pParam) { Ctest_1Dlg* pDlg = (Ctest_1Dlg*) pParam; Sleep(3500); return 1; }
-
Hallo,
die Lösung des Problems lag eigentlich auf der Hand.Ich wusste, dass das Problem mit Timeout (Sleep(5000)) nicht bestand und ohne Timeout bestand. Offensichtlich musste das Problem also in WaitForMultipleObjects liegen.
Da ich bisher keine schlechten Erfahrungen mit WaitForSingleObjects gemacht habe, bin ich diesem Ansatz nicht weiter nachgegangen, bis ich ein Paper (http://www.weblearn.hs-bremen.de/risse/RST/WS02/multithreading.pdf) gefunden habe.
Darin verwenden die Autoren eine alternative Lösung, um auf die Threads zu warten.
Mit der neuen Funktion bleiben die Fehler aus und außerdem spare ich mir das HANDLE array.
Grüße,
Michael