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??????
-
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
AbbruchCGPSSimulationDlg 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.