Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Bedingung "symbolleistenbutton gedrückt"

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 ] [ 2 ] [ 3 ] > 4 < [ 5 ]
030
05.06.2003, 10:58 Uhr
Dirk22



Ich habe es ausprobiert, aber es funktioniert nicht. Ich weiss auch nicht, was ich noch machen soll.
Ich könnte dir ja mal ein Programm schicken, dass nur den Code hat, der für dieses Problem zuständig ist.

Trotzdem vielen Dank

Dirk
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
031
05.06.2003, 11:03 Uhr
mike
Pinguinhüpfer
(Operator)


Hi!
Schicks einfach an mvodep@gmx.net

mfg mike
--
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
032
05.06.2003, 11:10 Uhr
Dirk22



Oder ich beschreib dir die Sache mal ganz genau:
Ich habe einen Startbutton und einen Stopbutton in der Symbolleiste. Anfangs soll der Stopbutton deaktiviert und der Startbutton aktiviert sein. Bei Klick auf den Startbutton soll der Startbutton deaktiviert werden und der Stopbutton aktiviert werden. Bei Klick auf den Stopbutton soll der Stopbutton deaktiviert und der Startbutton aktiviert werden.

Ich habe zuerst eine boolesche Variable im Headerfile der Mainframe angelegt

C++:
bool StopClicked;


Dann habe ich diese Variable im Konstruktor der Mainframe initialisiert:

C++:
StopClicked = true;



Meine Startbuttonroutine sieht folgendermassen aus:

C++:
CMainframe::OnButtonStart()
{
    StopClicked = false;
    m_wndToolBar.SendMessage(WM_INITMENUPOPUP,0,0);

    while (!StopClicked)
    {    
        while(PeekMessage(&msg,NULL,0,0,PM_NOREMOVE))                      AfxGetApp()->PumpMessage();
        
        //eigener Code
    }
}



Meine Stopbuttonroutine sieht folgendermassen aus:


C++:
CMainframe::OnButtonStop()
{
    StopClicked = true;    
    m_wndToolBar.SendMessage(WM_INITMENUPOPUP,0,0);

    //eigener Code
}    



So sehen die wesentlichen Teile in meinem Programm aus, die für dieses Problem von Bedeutung sind.

Wäre super, wenn du es anstatt mit dem Timer mal mit dem PeekMessage() und PumpMessage() ausprobieren könntest.


Vielen Dank im Voraus

Dirk
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
033
05.06.2003, 12:41 Uhr
mike
Pinguinhüpfer
(Operator)


Hi!
Die Schleife blockiert die ganze Funktion. Du kannst zwar das Programm weiter benutzen - musst aber wahrscheinlich (habs noch nie egmacht) die Messages selbst abfangen. Ich würde dir noch immer empfehlen, dass du mit AfxBeginThread einen neuen Thread startest und dort die Berchnung machst. Habs damit probiert und es scheint zu funktionieren.

mfg mike
--

Dieser Post wurde am 05.06.2003 um 12:41 Uhr von mike editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
034
05.06.2003, 13:48 Uhr
Dirk22



Danke für deine Mühe.
Kannst du mir vielleicht mal ein kleines Beispiel zu AfxBeginThread geben. Am besten anhand meines Beispiels, wo und wie ich diesen einsetzen muss. Ich habe noch nie mit AfxBeginThread() gearbeitet.

Vielen Dank im Voraus

Dirk
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
035
05.06.2003, 14:30 Uhr
mike
Pinguinhüpfer
(Operator)


Hi!

Zitat:

Am besten anhand meines Beispiels, wo und wie ich diesen einsetzen muss


Ich kenn dein Problem nicht - also fange ich mit dem Source oben auch ncihts an

C++:
UINT MyCalcFunction( LPVOID pParam )
{
    CTime curTime;
    for(int i = 0; i < 1000; i++) {
        Sleep(100);        
        curTime = CTime::GetCurrentTime();
        TRACE("%d:%d:%d\n", curTime.GetHour(),
        curTime.GetMinute(),
        curTime.GetSecond());
    }

    return 0;
}


Initialisierung:

C++:
m_b = TRUE;
m_pThread = AfxBeginThread (MyCalcFunction, this, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);


Rest:

C++:
void CMainFrame::OnStart()
{
    m_b = FALSE;
    m_pThread->ResumeThread();
}

void CMainFrame::OnUpdateStart(CCmdUI* pCmdUI)
{
    if(m_b)
        pCmdUI->Enable(TRUE);
    else
        pCmdUI->Enable(FALSE);
}

void CMainFrame::OnStop()
{
    m_b = TRUE;    
    m_pThread->SuspendThread();
}

void CMainFrame::OnUpdateStop(CCmdUI* pCmdUI)
{
    if(m_b)
        pCmdUI->Enable(FALSE);
    else
        pCmdUI->Enable(TRUE);
}



So würde ich es machen

mfg mike
--

Dieser Post wurde am 05.06.2003 um 14:31 Uhr von mike editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
036
05.06.2003, 15:52 Uhr
Dirk22



Erstmal vielen Dank für die ausführliche Antwort. Das mit den Threads hat mich schon lange mal interessiert.
Ich habe jetzt gerade ein neues Projekt angelegt und will dort deinen Code ausprobieren.

m_pThread habe ich in der Headerdatei der Mainframe folgendermassen deklariert:

C++:
CWinThread* m_pThread

Und dann habe ich wirklich deine Funktion MyCalcFunction genauso wie sie du oben hast einfach irgendwo in die Mainframe.cpp gesteckt.
Gut, bisher funktioniert es.
Zur Initialisierung habe ich den Konstruktor der Mainframe genommen.
Und ich komme nun nicht zurecht mit dem Befehl AfxBeginThread()
Wenn ich ihn genauso nehme wie du ihn oben unter Initialisierung beschrieben hast, dann bekomme ich folgende Fehler:

error C2065: 'MyCalcFunction' : nichtdeklarierter Bezeichner
error C2373: 'MyCalcFunction' : Neudefinition; unterschiedliche Modifizierer

Was mache ich falsch? Hätte ich die Funktion MyCalcFunction auch im Header der Mainframe deklarieren müssen und sie dann in der Mainframe.cpp mit Mainframe::MyCalcFunction aufrufen müssen? Oder woran liegt es dass ich diese Fehlermeldungen bekomme? Wie mache ich es richtig?

Sorry, dass ich so viele Fragen stelle. Aber ich will das jetzt hinkriegen und auch genau verstehen, wie es geht.

Vielen Dank im Voraus

Dirk
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
037
05.06.2003, 16:29 Uhr
mike
Pinguinhüpfer
(Operator)


Hi!
Es ist wichtig, dass die Funktion MyCalcFunction vor AfxBeginThread deklariert wird.

mfg mike
--

Dieser Post wurde am 05.06.2003 um 16:30 Uhr von mike editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
038
06.06.2003, 09:28 Uhr
Dirk22



Danke, in meinem Testprogramm funktioniert es jetzt. Aber jetzt habe ich es gerade in mein großes Programm eingebaut und habe nun folgendes Problem:
Ich habe viele Funktionen und Attribute in der Mainframe selbst angelegt, die ich in diesem Thread aufrufen will. Doch er bringt mir dann viele Fehlermeldungen, weil er diese nicht kennt. Wie schaffe ich es, dass ich in meinem Thread auf diese zugreifen kann?

Vielen Dank im Voraus

Dirk
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
039
06.06.2003, 09:38 Uhr
mike
Pinguinhüpfer
(Operator)


Hi!
Ich hoffe ich hab dich richtig verstanden, aber der Zugriff erfolgt normalerweise folgendermaßen:

C++:
CMainFrame* pMain = (CMainFrame*)AfxGetMainWnd();



mfg mike
--
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] [ 2 ] [ 3 ] > 4 < [ 5 ]     [ 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: