[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


Anmelden zum Antworten