In Thread ein Drawwindow aktualisieren



  • Ich hab mir einen Dialog gebaut der sehr viele Daten Anzeig .... aber beim Felder füllen friert die Oberfläche komplett ein. Ok ich hab mir überlegt, dass ich das dann evtl über nenn Thread lösen kann, allerdings ist mir nicht ganz klar wie. Es ist eigentlich nur eine Schleife die dann alles blockiert .... sie dauert halt dummerweise relativ lange´und ich würde mir halt noch wünschen dass ich die schleife beim Klick eines buttons verlassen kann.

    hab grad den Threadmiteingebaut ..... hab da aber noch so meine probleme.

    //So ruf ich den Thread auf:
    m_pThread = AfxBeginThread(Output, LPVOID(this));
    
    //Sp sieht die Methoden aus
    UINT
    DialogAnalog::Output(LPVOID pParam){
    
    	for (int i = 0; i < mv_data.size(); ++i){
    			GotoPosition(i);
    			FillFields(i);
    			UpdateTime(0,i);
    	}
    
    	return 0;
    
    }
    
    das hier ist die Methode die als Thread ausgeführt werden soll, bekomm aber die meldungen dass es net klappt
    
    C:\projekt\mfcdatei\DialogAnalog.cpp(139) : warning C4805: '==' : unsichere Kombination von Typ 'int' mit Typ 'const bool' in einer Operation
    C:\projekt\mfcdatei\DialogAnalog.cpp(125) : warning C4101: 'data' : Unreferenzierte lokale Variable
    C:\projekt\mfcdatei\DialogAnalog.cpp(127) : warning C4101: 'charbuffer' : Unreferenzierte lokale Variable
    C:\projekt\mfcdatei\DialogAnalog.cpp(184) : warning C4101: 'data' : Unreferenzierte lokale Variable
    C:\projekt\mfcdatei\DialogAnalog.cpp(186) : warning C4101: 'buffer' : Unreferenzierte lokale Variable
    C:\projekt\mfcdatei\DialogAnalog.cpp(560) : error C2228: Der linke Teil von '.size' muss eine Klasse/Struktur/Union sein
    C:\projekt\mfcdatei\DialogAnalog.cpp(561) : error C2352: 'DialogAnalog::GotoPosition' : Unzulaessiger Aufruf einer nichtstatischen Member-Funktion
            c:\projekt\mfcdatei\dialoganalog.h(84) : Siehe Deklaration von 'GotoPosition'
    C:\projekt\mfcdatei\DialogAnalog.cpp(562) : error C2352: 'DialogAnalog::FillFields' : Unzulaessiger Aufruf einer nichtstatischen Member-Funktion
            c:\projekt\mfcdatei\dialoganalog.h(82) : Siehe Deklaration von 'FillFields'
    C:\projekt\mfcdatei\DialogAnalog.cpp(563) : error C2352: 'DialogAnalog::UpdateTime' : Unzulaessiger Aufruf einer nichtstatischen Member-Funktion
            c:\projekt\mfcdatei\dialoganalog.h(80) : Siehe Deklaration von 'UpdateTime'
    

    Cosmixx du meintest doch ich kann auch non Static methoden aufrufen
    .... nur wie mit den Fehlermeldungen seh ich da grad keine Möglichkeit.
    ========================================================================)

    nachdem das mit der Nonsatic geschichte funkt, hab ich aber noch ein kleines Problem. In dem Dialog den ich mir da gebastelt hab ist ein kleines OpenGL Fenster eingebaut, das aber durch den Thread seltsamerweise nicht aktualisiert wird. Wenn ich das ohne Thread mach klappts. Ich denk es ist weniger ein OpenGL Problem sondern eher dass ich dem Bild gesondert eine Updateanweisung schicken muss hab aber bisher nicht wirklich was gefunden.
    Hier mal der Code der beim Thread ausgeführt wird.

    INT
    DialogAnalog::Output(LPVOID pParam){
    
    	DialogAnalog *pDialogAnalog = (DialogAnalog*) pParam;
    
    	for (int i = 0; i < pDialogAnalog->mv_data.size() && pDialogAnalog->m_Interrupt != 1; ++i){
    			pDialogAnalog->GotoPosition(i);
    			pDialogAnalog->FillFields(i);
    			pDialogAnalog->UpdateTime(0,i);
    			pDialogAnalog->UpdateGlWindow();
    
    	}
    
    	return 0;
    
    }
    

    Hier mal wie ich mir mein GLWindow aufbaue bzw. nutze

    BOOL DialogAnalog::OnInitDialog()
    {
    	CDialog::OnInitDialog();
    
        m_Interrupt = 0;
    
    	pclStatic = (CStatic *)GetDlgItem(IDC_OPENGLWIN);
    	pclGlView = new CGlView(pclStatic);
    //	pclGlView->SetPixelformat(m_hDC);
    
    	pclGlView->DrawGLScene();
    
    	return true;
    
    }
    
    void DialogAnalog::OnPaint() 
    {
    
    	if (IsIconic())
    	{
    		CPaintDC dc(this); // device context for painting
    
    		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
    
    		// Center icon in client rectangle
    		int cxIcon = GetSystemMetrics(SM_CXICON);
    		int cyIcon = GetSystemMetrics(SM_CYICON);
    		CRect rect;
    		GetClientRect(&rect);
    		int x = (rect.Width() - cxIcon + 1) / 2;
    		int y = (rect.Height() - cyIcon + 1) / 2;
    
    		// Draw the icon
    		dc.DrawIcon(x, y, m_hIcon);
    	}
    	else
    	{
    	CDialog::OnPaint();
    	}
    
    	CPaintDC dc(this); // device context for painting
    
    	HDC m_hDC;
        m_hDC = ::GetDC(this->m_hWnd);
    
        RECT rect;
    	GetClientRect(&rect);
    
        int iWidth = -(rect.right - rect.left);
        int iHeight = rect.top - rect.bottom;
    
    	pclGlView->OnCreate();
    	pclGlView->ReSizeGLScene(iWidth, iHeight);
    	pclGlView->InitGL();
    	pclGlView->DrawGLScene();
    
    }
    
    void
    DialogAnalog::UpdateGlWindow(){
    
    	pclGlView->size = (float)m_intSlider * 0.005f;
    	pclGlView->DrawGLScene();
    
    }
    

    Also vielleicht wisst ihr ja warums net geht



  • Hallo,
    ja mit nem Thread sollte es gehen, schau mal hier im Forum. Da gibts viele, die was über Threads wissen wollten.

    Als kleiner Anreiz:

    Mit
    CWinThread * m_pThread=AfxBeginThread(ThreadProc, LPVOID(this));
    den Thread aufrufen, dies Thread-Methode muss so deklariert sein:
    static UINT ThreadProc(LPVOID pParam);

    Zwar muss die eigentliche Thread-Methode static deklariert sein, du kannst aber eine non-static Methode aus der Thread-Methode heraus aufrufen. 🕶

    Cosmixx



  • Threads ist der korrekte Lösungsansatz.
    Kannst direkt in die FAQ schauen, dort gibts ne Lösung!



  • cool danke ;o) dann zieh ich mir mal die faq´s rein





  • Nur noch eine kurze Anmerkung, in den Methoden die man dann aufruft sollte kein UpdateData aufgerufen werden ....... bei mir ist dann einfach das Programm abgeraucht ;o) nur falls jemand mal das selbe Problem hat.

    .... nu hab ich haber schon wieder ein anderes Problem ..... hab ich oben angehängt


Anmelden zum Antworten