Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Thread synchronisieren

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
29.07.2004, 02:11 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


angenommen ich habe sowas


C++:
DWORD CMyDlg::func(LPVOID lparam){

    CMyDlg*dp = ((CMyDlg*)lparam);

    while(!dp->endflag){
        dp->doSomething();
        Sleep(60);//damit der nicht gegen 100% auslastung fährt
    }
    ::PostMessage(dp->m_hWnd,WM_QUIT,NULL,NULL);

    return 0;
}



so jetzt kann der benutzer mittels kontrols bestimmte membervariablen beeinflussen...
irgenwie muss ichs so hinbekommen das diese beinflussung, also alles was der user tut erst ausgeführt wird wenn dp->doSomething() durchglaufen ist...

kann man z.b. in pretranslate alle mouse und tastaturevents abfangen und diese so lange blockieren bis doSomething einmal durch ist, ist und dann do Something wiederum so lange blockieren bis alle messages abgearbeitet sind... usw... also wie macht mans richtig


ach so und warum hat ::PostMessage(dp->m_hWnd,WM_CLOSE,NULL,NULL); keinen einfluss aber mit WM_QUIT funzt es? so lange ich nur ein fester habe spiellt es ja keine rolle aber wenn dieses fenster ein modaler dialog eines anderen fensters ist killt der mir ja sonst die ganze application aber ich will ja nur das fenster schliessen...
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 29.07.2004 um 02:14 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
29.07.2004, 02:39 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


argh das mit dem WM_CLOSE funzt jetzt...
lag daran das ich OnCancel von Hand überladen habe aber nicht CDialog::OnCancel eingefügt habe


C++:
void CViewerDlg::OnCancel(){
CDialog::OnCancel();//warum funzt das nicht wenn ich das hier weglasse ist mir irgendwie nicht wirklich klar hab durch rumprobieren rausgefunden das es an meinem überschreiben des OnCancel liegt, man war der fehler scheisse zu finden
endflag=1;
}



--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
29.07.2004, 16:36 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


@Spacy
also ums nochmal ein wenig zu präzisieren...

doSomething ist bei mir richtig gross (weit über über 10 seiten quelltext der da aufgerufen wird) durchlauf dauerst so ca 200ms je nachdem was so alles ein oder ausgeschaltet ist...

ich habe massenweise steuerelemente bei denen bestimmte eintsellungskombinationen nicht erlaubt sein sollen... also insbesonder soll der thread nicht zu hälfte innerhalb der doSomething funktion mit der einen einstellung und zur anderen hälfte mit der anderen einstellung weiterlaufen...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
29.07.2004, 17:57 Uhr
Spacelord
Hoffnungsloser Fall


Also deinen doSomething Block und alle Codefragmente in denen die Membervariablen,die in doSomething benutzt werden,geändert werden könnten kannst du mit CCriticalSection synchronisieren.



C++:
       CMyDlg*dp = ((CMyDlg*)lparam);



Das solltest du nicht tun!!
Probier mal zu Testzwecken z.B. dp->UpdateData(true) in der Threadfunktion auszuführen.
Das sollte eigentlich satt in die Hose gehen!?

Besser ist es das Handle des Fensters zu übergeben und dir mit FromHandle einen sicheren Pointer zu besorgen.Das war hier letztens erst Thema:
www.fun-soft.de/showtopic.php?threadid=8256&time=1091116032


C++:
void CViewerDlg::OnCancel(){
CDialog::OnCancel();//warum funzt das nicht wenn ich das hier weglasse ist mir irgendwie nicht wirklich klar hab durch rumprobieren rausgefunden das es an meinem überschreiben des OnCancel liegt, man war der fehler scheisse zu finden
endflag=1;
}




CDialog::OnCancel() ruft EndDialog auf wo wiederum die entsprechenden Api Aufrufe gekapselt sind. Du könntest(denke ich) in OnCancel() auch selbst PostQuitMessage aufrufen.
Letztendlich ist aber unklar welche weiteren Aufräumarbeiten die MFC intern noch erledigen,
weshalb man ruhig OnCancel der Basisklasse aufrufen sollte.Klar,man könnte nachgucken was in CDialog::onCancel alles gemacht wird,aber wozu??

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: