Threads?



  • Hallo,

    ich habe eine Render Funktion die mir ein Bild generiert. In dieser Renderfunktion wird eine Funktion aufgerufen, welche das Bild nach Pattern absucht. Das Funktioniert auch wunderbar, nur bleibt das Bild stehen, sobald die Matchfunktion aufgerufen wird.

    Wie lasse ich die Funktion asynchron zum Rest von Render laufen? So dass, das Bild ohne stehen zu bleiben weiter läuft und die match Funktion nur die Ergebnisse zurück liefert, wenn sie ein Ergebnis hat.

    Danke und Grüße!

    HRESULT
    MRBBApp::Render(){
    	HRESULT hr = S_OK;
    	try{
    		// Get Video
    		m_pCamera->GetVideoBuffer(m_pData);
    
    		if(this->frameCounter != 0 && this->frameCounter % 10 == 0){
    				matcher->match(m_iVideoImgWidth, m_iVideoImgHeight,sizeof(short),(short*)m_pData, TEMP);
    		}
    
    		// Set Video Texture
    		//m_pData is RGB565 
    		m_pBackPlane->SetTexture(m_pData);
    
    		// Clear the backbuffer to a blue color
    		hr = m_pD3DMDevice->Clear( 0, NULL, D3DMCLEAR_TARGET | D3DMCLEAR_ZBUFFER, D3DMCOLOR_XRGB(0,0,255), 1.0f, 0 );
    
    		// Begin the scene
    		if( SUCCEEDED( hr = m_pD3DMDevice->BeginScene() ) ){
    			// Draw Video Background
    			m_pBackPlane->Draw();
    			hr = m_pD3DMDevice->EndScene();
    		}
    		hr = m_pD3DMDevice->Present( NULL, NULL, NULL, NULL );
    	}catch(...){
    		OutputDebugString(L"Exception in Render-Loop caught!\n");
    		MessageBox(NULL,L"Exception in Render-Loop!", L"Error!", MB_OK | MB_ICONERROR);
    		return E_FAIL;
    	}
    	CalculateFramerate();
    	return hr;
    }
    

  • Mod

    Eine Threadklasse bauaen.
    Daten in diese Klasse packen
    Thread starten
    Zukylisch prüfen ob der Thread Daten gefunden hat.

    Nur kann es ja nicht sein, dass Du für jeden Render Vorgang einen Thread startest...



  • Da hast du sicherlich recht...

    Also lasse ich das Matching in einem Thread laufen und schaue in Render() ob der Thread Daten liefert?


  • Mod

    Richtig. Ich würde evtl. diesen Testthread immer laufen lassen.

    Hat er nichts zu tun, gibst Du ihm was zu tun. Sind Daten da, machst Du damit was Du denkst. Ansonsten gibst Du ihm den nächsten Job.



  • Wenn ich mir mein Objekt mach, starte ich anschließend den Thread mit ->run() (z.B).

    Aber wie fütter ich den Thread mit den Daten aus Render()? Und wie teste ich ob Daten zur Verfügung stehen?

    Danke und Grüße


  • Mod

    Du kommunizierst über Events. Du benötigst 3 Events
    a. Bereit neuen Job zu übernehmen
    b. Starte Berechnung
    c. Ergebnisse sind fertig

    a+c kann man evtl. kombinieren.

    Die Daten übergibst Du in einem entsprechenden Speicher nur dann, wenn der Thread bereit ist Daten anzunehmen. Dann startest Du die Berechnung durch setzen des Events.



  • Also mache ich mir die Events global verfügbar und guck ob ein Job laufen darf oder nicht?

    Das Objekt matcher hat alle Daten, auch einen Pointer auf die Bilddaten

    matcher = new MMRTTemplateMatching(m_iVideoImgWidth, m_iVideoImgHeight, sizeof(short), TEMP, (short*)m_pData);

    Im Konstruktor starte ich dann den Thread... also

    this->hThread = CreateThread(NULL, 0, matcher, NULL , 0 , &this->dwThreadId);
    und mein event ist dann event_is_not_bussy

    Jetzt mach ich in Render()

    if(event_is_not_bussy)
    das dem Thread mach weiter
    if(event_thread_has_data)
    gibt mir die daten
    if(event_at_work)
    mach nix

    Stimmt das so irgendwie?
    Wie bekomme ich ein Ergebnis aus dem Thread?



  • Ok hab mich gestern bisschen doof angestellt 😃
    Nach ein bisschen schlafen habe ich es geschafft 😛

    Danke für deine Hilfe


Anmelden zum Antworten