Visual Studio 2008 MFC ProgressBar



  • Hallo ich habe ein Problem ich habe ein ProgressBar der auch initalisiert wird. Soll heißen, ich kann mit SetPos(5) einen Wert setzen und der wird angezeigt. Nun soll das ganze aber dynamisch laufen und zwar habe ich einen anderen Thread der Nachrichten sendet und solange er sendet soll die Anzeige sich updaten. wie kann ich den PrograssBar aus einem anderen Thread updaten???

    BOOL CGPSSimulationDlg::OnInitDialog()
    {
    	CDialog::OnInitDialog();
    
    	// Hinzufügen des Menübefehls "Info..." zum Systemmenü.
    
    	// IDM_ABOUTBOX muss sich im Bereich der Systembefehle befinden.
    	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    	ASSERT(IDM_ABOUTBOX < 0xF000);
    
    	CMenu* pSysMenu = GetSystemMenu(FALSE);
    	if (pSysMenu != NULL)
    	{
    		BOOL bNameValid;
    		CString strAboutMenu;
    		bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
    		ASSERT(bNameValid);
    		if (!strAboutMenu.IsEmpty())
    		{
    			pSysMenu->AppendMenu(MF_SEPARATOR);
    			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
    		}
    	}
    
    	// Symbol für dieses Dialogfeld festlegen. Wird automatisch erledigt
    	//  wenn das Hauptfenster der Anwendung kein Dialogfeld ist
    	SetIcon(m_hIcon, TRUE);			// Großes Symbol verwenden
    	SetIcon(m_hIcon, FALSE);		// Kleines Symbol verwenden
    	// TODO: Hier zusätzliche Initialisierung einfügen
    
    	CProgressCtrl *pprog=(CProgressCtrl*)GetDlgItem(IDC_PROGRESS1);
    	pprog->SetRange(0,100);
    	pprog->SetPos(ivalue);
    

    das war die Initialisierung;

    result = theApp.Send( theApp.buf, strlen(theApp.buf) , 0);
    						if(result >= 0)
    						{
    							str = theApp.buf;
    							Sleep(50);
    						}	
    
    /////////////////////////////////////hier soll der update eingefühgt werden!!
    
    						memset(theApp.buf,0,sizeof(theApp.buf));
    						strcpy(theApp.buf, strBuffer); 
    						theApp.InsertEndOfString( theApp.buf);
    

    Kann mir jemand helfen??????


  • Mod

    Indem Du entweder Deinem Dialog oder dem Progressbar die Nachricht sendest.
    Ich würde im Dialog eine eigene Applikations spezifische Nachricht empfangen lassen und den ar dann anpassen. Wichtig: Der Mainthread muss weiterhin die Message-Loop ausführen und darf nicht WaitForSingleObject ausführen oder so.



  • Das habe ich versucht indem ich in dem erzeugten Thread ein objekt erzeuge

    CGPSSimulationDlg dlg;
    und dann über dlg auf die Methode zugreife.

    Funktioniert nicht
    Abbruch

    CGPSSimulationDlg dlg;
    	dlg.SetProgressBar(50,IDC_PROGRESS);
    
    void CGPSSimulationDlg::SetProgressBar(int value, int number)
    {
    	switch (number)
    	{
    		case IDC_PROGRESS1:
    			m_ProgressBar.SetPos(value);
    			break;
             }
    }
    


  • schau dir das an

    http://vcfaq.mvps.org/mfc/12.htm

    da wird beschrieben wie man eine User Message händelt.

    Was du gemacht hast, ist ein Objekt der Klasse erstellt die aber nicht initialisiert iswt, also kennt die klasse auch kein IDC_PROGRESS

    Wenn dann musst du schon den this-Zeiger an den Thread übergeben und darüber kannst du dann weiter arbeiten, sicherer ist aber das Handle auf das Window zu übergeben und damit zu arbeiten.


Anmelden zum Antworten