Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Nachrichtenbehandlungsroutine aufrufen

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
21.06.2003, 19:35 Uhr
Dirk22



Hi, ich habe folgendes Problem. Ich möchte eine mit dem Klassenassistenten erstellte Nachrichtenbehandlungsroutine von irgendwo im Code aufrufen. Wie geht das? Muss ich da PostMessage() dazunehmen? Wenn ja, wie geht das?
Mit Nachrichtenbehandlungsroutine meine ich z.B. folgendes: Dann wenn der Benutzer z.B. auf einen Button drückt, dann wird dieser Code aufgerufen. Und ich will jetzt diese Routine auch von irgendwo in meinem Programm aufrufen können, wie ich z.B. auch von irgendwo in meinem Programm aus normale Funktionen aufrufen kann.

Vielen Dank im Voraus

Dirk
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
21.06.2003, 19:42 Uhr
mike
Pinguinhüpfer
(Operator)


Hi!
Du kannst SendMessage oder PostMessage nehmen und anschließende mit dem Makro ON_MESSAGE die Nachricht wieder einfangen

mfg mike
--
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
21.06.2003, 20:04 Uhr
Dirk22



Du kennst ja mein Beispielprogramm. Ich möchte am Ende meines Threads die Routine OnButtonStop() aufrufen. Kannst du mir bitte mal ein kleines Beispiel dazu machen. Oder irgendein anderes zur genauen Verwendung von Post- bzw. SendMessage. Das wäre echt super.

Vielen Dank im Voraus

Dirk
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
21.06.2003, 20:26 Uhr
mike
Pinguinhüpfer
(Operator)


Hi!
Also OnButtonStop() ist eh eine selbstständige Funktion. Ich denke, du kannst die direkt aufrufen.

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/messagesandmessagequeues/messagesandmessagequeuesreference/messagesandmessagequeuesfunctions/sendmessage.asp

mfg mike
PS: Wenn ich jetzt nicht mehr antworte, liegt es daran dass ich für ein paar Wochen fort bin rofl
--

Dieser Post wurde am 21.06.2003 um 20:33 Uhr von mike editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
21.06.2003, 21:21 Uhr
Dirk22



Danke für deine Antwort. Theoretisch könnte ich diese Funktion schon direkt aufrufen, aber der Klassenassistent hat sie unter protected eingefügt. Und ich weiss jetzt auch nicht, ob es so gut ist, diese Funktion jetzt von Hand in eine public Sektion zu stecken.

Ich zeige das Problem mal genauer auf:

In der MainFrame.h steht unter anderem das:

C++:
CWinThread* pThread;
.
.
.
// Generierte Message-Map-Funktionen
protected:
    //{{AFX_MSG(CMainFrame)
    afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
    afx_msg void OnButtonStart();
    afx_msg void OnButtonStop();
    afx_msg void OnUpdateButtonStop(CCmdUI* pCmdUI);
    afx_msg void OnUpdateButtonStart(CCmdUI* pCmdUI);
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()



In der MainFrame.cpp steht unter anderem das:

C++:
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
    //{{AFX_MSG_MAP(CMainFrame)
    ON_WM_CREATE()
    ON_COMMAND(ID_BUTTON_START, OnButtonStart)
    ON_COMMAND(ID_BUTTON_STOP, OnButtonStop)
    ON_UPDATE_COMMAND_UI(ID_BUTTON_STOP, OnUpdateButtonStop)
    ON_UPDATE_COMMAND_UI(ID_BUTTON_START, OnUpdateButtonStart)
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()
.
.
.
//Im Konstruktor der MainFrame:
pThread = AfxBeginThread (MyCalcFunction, this, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);
//Ende Konstruktor der MainFrame
.
.
.
/////////////////////////////////////////////////////////////////////////////
// CMainFrame Nachrichten-Handler


void CMainFrame::OnButtonStart()
{
    StopClicked = false;
    pThread->ResumeThread();
    
}

void CMainFrame::OnButtonStop()
{
    StopClicked = true;
    pThread->SuspendThread();
}

void CMainFrame::OnUpdateButtonStop(CCmdUI* pCmdUI)
{
    if (StopClicked) pCmdUI->Enable(false);      
            else pCmdUI->Enable(true);                  
}

void CMainFrame::OnUpdateButtonStart(CCmdUI* pCmdUI)
{
    if (!StopClicked) pCmdUI->Enable(false);    
             else pCmdUI->Enable(true);              
}



UINT MyCalcFunction( LPVOID pParam )
{
    
    CMainFrame* pMain = (CMainFrame*)AfxGetMainWnd();

    while(!StopClicked)
             {
           //Berechnung
             }
      //an dieser Stelle möchte ich die Funktion OnButtonStop() aufrufen
      //bisher habe ich es so gemacht: pMain->OnButtonStop()
      //dies wurde aber nur kompiliert, wenn ich im Headerfile die Funktion
      //unter public gesteckt habe, und dann hat es aber doch nichts genützt
      //da das Programm dann immer an dieser Stelle abgestürzt ist
    return 0;
}



Ich habe mir jetzt den Link angeschaut, aber leider komme ich damit nicht zurecht, was ich hier in meinem Fall genau tun soll. Ich weiss nicht, wie ich die einzelnen Parameter der Funktion Post- oder SendMessage füllen soll.
Dies hier ist auch nur ein Beispielprogramm das die Problematik die ich habe darstellt. Es soll hier keine Rolle spielen, ob es in diesem Fall Sinn macht, die Stopbuttonroutine am Ende des Threads aufzurufen, oder nicht. In dem Programm, in dem ich das anwenden will, macht es Sinn.
Ich will wirklich einfach nur aus diesem Thread heraus, die Nachrichtenbehandlungsroutine bzw. Funktion OnButtonStop() aufrufen, welche mit dem Klassenassistent erstellt wurde.

Ich hoffe, dass ihr mir helfen könnt

Dirk
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
22.06.2003, 09:44 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Probier mal wenn du einfach dir eine Public-Memberfunktion einfügst welche z.b Stop heisst, welche du dann aus beiden (OnButtonStop und Thread) aufrufst...
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
22.06.2003, 10:59 Uhr
Dirk22



Danke für die Antwort. Das funktioniert im Prinzip schon. Besser gefallen würde mir aber natürlich schon die Lösung, die Methode, welche es schon gibt direkt ansprechen zu können. Ausserdem würde es mich halt einfach interessieren wie das mit dem Nachrichten senden funktioniert.
Ich bin jetzt erst heute nachmittag wieder da. Werde dann noch etwas rumprobieren.

Dirk
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
22.06.2003, 16:56 Uhr
Dirk22



Jetzt habe ich noch ein Problem bei der ganzen Sache. Es bezieht sich immer noch alles auf den vorhin angegebenen Code:

Ich habe z.B. eine int-Variable namens anzahl in Mainframe.h deklariert

C++:

//MainFrame.h
public:
      int anzahl;


Nun möchte ich diese in meinem Thread MyCalcFunction benutzen.

C++:
//Threadfunktion
UINT MyCalcFunction( LPVOID pParam )
{
        CMainFrame* pMain = (CMainFrame*)AfxGetMainWnd();
        pMain->anzahl = 5;  //er kompiliert es, aber hier stürzt er dann ab
        return 0;
}



Wenn ich Variablen, die ich in MainFrame.h deklariert habe in meinem Thread
so wie gerade aufgezeigt einsetze, so kann das Programm dann zwar deklariert werden, aber es bringt dann folgenden Fehler:
Debug Assertion failed: File: wincore.cpp Line: 958

Wie schaffe ich es Variablen, die ich in MainFrame.h deklariert habe in meinem Thread einzusetzen?

Vielen Dank im Voraus

Dirk
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
22.06.2003, 17:00 Uhr
Dirk22



Hi,


Zitat:
... so kann das Programm dann zwar deklariert werden, aber es bringt dann folgenden Fehler:...


Ich meinte bei diesem Satz natürlich nicht deklariert, sonder kompiliert.

mfg Dirk
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
23.06.2003, 10:28 Uhr
Dirk22



Hi,

dieses Problem hat sich erledigt. Ich habe jetzt den Paramter pParam der Threadfunktion benutzt, um meine Variablen zu übergeben. Und nun klappt es.

mfg

Dirk
 
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: