einfaches thread
-
oohhhhhhhhhhhhhhhhhhhhhhhhhhhhh
es funktioniert
ich danke euch alle.
zitat
ich freue mich...
-
hi pellaeon
kannst du mir ein beispiel mit dem timer schicken.. neugirig
wäre sehr nett.
mit dem thread hat funktioniert dank rapha.
-
Wenn du Timer verwenden willst, mach einfach eine Behandlungsroutine für die WM_TIMER Nachricht:
long l = 1; // unsre globale Zählervariable (besser du verwendest eine Membervariable in CProgressControlDlg void CProgressControlDlg::OnTimer(UINT nIDEvent) { l++; if (l == 1000000) { // l ist 1000000 // tue was KillTimer(0 /* unsere TimerID */); // Timer stoppen } CDialog::OnTimer(nIDEvent); }
Und dann kannst du, wenn man auf den Button klickt, den Timer aufrufen
SetTimer(0, // die id unseres Timers (frei wählbar) 10, // mit welchen Abständen OnTimer aufgerufen werden soll (hier alle 10 Millisekunden) NULL // reserviert, muss immer 0 sein );
-
hätt ich nicht besser machen können
-
vielen dank ihr zwei
-
Pellaeon schrieb:
ich sags doch lass die Finger von Threads :p
der timer reicht hier vollkommen aus
Sorry aber: Was für ein Quatsch.
Dafür wurden Threads erschaffen.
Auch wenn ein Timer ausreicht bekommt man einen Timer nur wenn Zeit ist und das auch nur ca. alle 50ms.
Wenn aber aber diese SChleife ohne Pause abarbeiten will dann geht da nichts mit Timer.
Und im Timer dann die SChleife aufrufen macht genausowenig SInn wie der erste Code.
-
Er sollte ja auch nicht im Timer ne Schleife machen
-
Noch eine frage,
wie kann ich
UpdateData(FALSE);
bearbeite um ein editcontrovariable auf dem dialog zu updaten durch CountThread.
es liefert mir
Unzulässiger Aufruf einer nicht statischen MemberfunktionUINT CProgressControlDlg::CountThread2( LPVOID pParam ) { dokdok= i ; //UpdateData(FALSE); return 0; }
-
du brauchst einen Zeiger auf den Dialog, damit du die Methode aufrufen kannst
-
zeiger ist mein fachgebiet.
.................................wie bitte.
viellecht ein beispiel
-
UINT CProgressControlDlg::CountThread2( LPVOID pParam )
Da hast du einen Parameter, beim Starten des Threads übergibts du den Zeiger des aufrundenen Dialoges und hier in der Thread-Funktion castest du den void-Zeiger nach CDialog.
CDialog pDiag = (CDialog*)pParam;
-
UINT CProgressControlDlg::CountThread2( LPVOID pParam ) { CDialog pDiag = (CDialog*)pParam; dokdok= i ; pDiag.UpdateData(FALSE); return 0; }
kommt der fehler
: error C2440: 'Initialisierung': 'CDialog *' kann nicht in 'CDialog' konvertiert werden
-
ja hab den Stern vergessen muss natürlich
CDialog* pDiag = (CDialog*)pParam;
heißen
-
ok..
compiler beschwert sich nicht.
beim ausführen..fehler unbehandelte ausnahme
calling UpdateData before doModal
-
Dann startest du wohl deinen Extra-Thread bevor der Dialog schon richtige zustande kam. Solche Probleme gilt es halt zu lösen wenn man Threads benutzt ... .
-
was soll ich jetzt machen
-
Entweder doch den Timer versuchen *gg* oder du musst entsprechende Kontrollstrukturen einführen. Irgendwie kann man sowas z.B. mit CEvent steuern. Habe ich aber selber noch nicht benutzt. Musst dich also mal schlau machen wie die funktionieren.
-
also danke pelleeon.
ich denke ich schalte auf andrem thema.....web server anmelden .
muß paar sachen testen..
-
updatedata kann man nicht in einem thread aufrufen.
du musst aus dem thread direkt in das control schreiben.
-
Was man alles umgehen könnte, wenn man KEINEN Thread hier benutzt ... .
Wozu? Er will keine Berechnung die 10 min dauert, er will einfach das Fenster ein Stück verschieben. Da reicht der Timer. Und in OnTimer kann er dann auch bequem sein UpdateData aufrufen.