einfaches thread
-
Ich rate vom Thread ab, weil er doch sein Fenster beeinflussen will. Dann schiebt er von nem anderen Thread aus, muss aufpassen das sich nichts ins Gehege kommt usw.
WM_TIMER benutzen und gut, wie ich schon weiter oben geschrieben habe
-
error C2665: 'AfxBeginThread': Durch keine der 2 Überladungen kann Parameter 1 vom Typ 'UINT' konvertiert werden
-
Parameter 1 ist falsch, es muss der Funktionszeiger auf die Threadfunktion sein.
Poste mal deinen Code
-
void CProgressControlDlg::OnBnClickedButton1() { LPVOID pParam; AfxBeginThread(CountThread(pParam) ,NULL); } UINT CProgressControlDlg::CountThread( LPVOID pParam ) { for (long l=0; l<1000000; l++) { // tue etwas } return 0; }
-
dokdok schrieb:
void CProgressControlDlg::OnBnClickedButton1()
{
LPVOID pParam;
AfxBeginThread(CountThread(pParam) ,NULL);
}Das muss
void CProgressControlDlg::OnBnClickedButton1() { LPVOID pParam; AfxBeginThread(CountThread ,NULL); }
heißen, denn CountThread(pParam) ruft die Funktion auf und gibt den rückgabewert an AfxBeginThread weiter (was dann ein UINT ist).
dokdok schrieb:
UINT CProgressControlDlg::CountThread( LPVOID pParam )
{
for (long l=0; l<1000000; l++)
{
// tue etwas
}
return 0;
}Das Funktioniert nur, wenn du CountThread in der Klasse CProgressControlDlg (mit static) statisch machst. Oder du definierst CountThread als globale Funktion.
-
ich sags doch lass die Finger von Threads :p
der timer reicht hier vollkommen aus
-
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