Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Pointer auf die View bei Cformview

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
07.06.2003, 14:41 Uhr
Dirk22



Hi,

ich habe ein SDI-Projekt, welches von CFormView abgeleitet ist. Nun möchte ich einen Pointer auf die View erstellen. Bisher habe ich es so gemacht, wie auf dieser Webseite erklärt:

http://cui.unige.ch/OSG/people/Past/fuentes/Mfc/HowTo_8.html

Es funktioniert auch, wenn ich diesen Pointer z.B. in den Funktionen der Mainframe einsetze. Aber sobald ich diesen Pointer in einem Thread einsetze, dann kommt ein Assertionfehler.

Ich habe schon Mike um Rat gefragt. Er meint, dass der Pointer auf die View wohl falsch sei. Es müsse irgendwie mit GetDlgItem funktionieren.

Wie kann ich einen Pointer auf die View erhalten?

Vielen Dank im Voraus

Dirk
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
07.06.2003, 15:10 Uhr
Uwe
C/C++ Master
(Administrator)


Hallo,

Zitat:
Dirk22 postete
Hi,
.....
Ich habe schon Mike um Rat gefragt. Er meint, dass der Pointer auf die View wohl falsch sei. Es müsse irgendwie mit GetDlgItem funktionieren.

Wie kann ich einen Pointer auf die View erhalten?
.....


Nicht ganz

C++:
CFrameWnd* pMain = (CFrameWnd*)AfxGetApp()->m_pMainWnd;
CView* pView = pMain->GetActiveView( );
CDocument* pDoc = pMain->GetActiveDocument( );


--
"Es ist schwierig, ein Programm wirklich idiotensicher zu machen, weil Idioten so genial sind."

Bis dann...
Uwe
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
07.06.2003, 15:59 Uhr
mike
Pinguinhüpfer
(Operator)



Zitat:
Dirk22 postete
Ich habe schon Mike um Rat gefragt. Er meint, dass der Pointer auf die View wohl falsch sei. Es müsse irgendwie mit GetDlgItem funktionieren.


Wiedr nicht ganz
Ich hab dir folgenden Code geschickt:

C++:
CMainFrame* pMain = (CMainFrame*)AfxGetMainWnd();
CTest_ThreadDoc* pDoc = (CTest_ThreadDoc*)pMain->GetActiveDocument();
POSITION pos = pDoc->GetFirstViewPosition();
CTest_ThreadView* pView = (CTest_ThreadView*)pDoc->GetNextView(pos);



Stimmt zwar nicht - aber fast *g*
Und wenn du den Pointer auf den View hast, brauchst du GetDlgItem!

Er meint, dass der Pointer auf die View wohl falsch sei. bezieht sich auf das, was ich dir oben im letzten mail geschrieben hab

mfg mike
--

Dieser Post wurde am 07.06.2003 um 16:05 Uhr von mike editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
07.06.2003, 16:23 Uhr
mike
Pinguinhüpfer
(Operator)


Hi!
Ich möchte nur noch ergänzen, dass der Aufruf in einem Thread erfolgt
Threadsegmente:

C++:
UINT MyCalcFunction( LPVOID pParam )
{   //Pointer AUf View bekommen
}


In CMainFrame::OnCreate:

C++:
pThread = AfxBeginThread (MyCalcFunction, this, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED); //in public CWinThread* pThread


Zusätzlich wird der Thread mit einem Button (im Toolbar) gestoppt und gestartet:

C++:
//In Startfunktion
pThread->ResumeThread();
//In Stopfunktion
pThread->SuspendThread();


Ich hab diesen Code in die Welt gesetzt und muss leider feststellen, dass, wenn man ein paar mal hintereinander hinaufklickt, eine Assertion kommt:

C++:
_AFXWIN_INLINE DWORD CWinThread::SuspendThread()
{ ASSERT(m_hThread != NULL); return ::SuspendThread(m_hThread); }


Warum wird pThread auf einmal NULL?????


Aber durch das Threading geht das mit dem Pointer anscheinend auch nicht mehr so einfach: Es kommt daher bei CDocument* pDoc = pMain->GetActiveDocument( ); zu einer Debug Assertion.

mfg mike
--

Dieser Post wurde am 07.06.2003 um 16:24 Uhr von mike editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
07.06.2003, 17:06 Uhr
mike
Pinguinhüpfer
(Operator)


löl
Ich habs gleiche Programm nochmals geschrieben und bei mir gibts bezüglich des SuspendThreads keine Probleme.


mfg
--
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
07.06.2003, 19:30 Uhr
Dirk22



@Mike: sorry, wenn ich da vielleicht irgendetwas falsch verstanden habe

Wenn ich das richtig verstehe, dann klappt es so also auch nicht mein Problem mit dem Zeiger in dem Thread zu lösen. Ich habe gerade die Zeigerkonstruktion von Uwe ausprobiert, und auch dann kam der Debug Assertion Fehler.

Falls jemand noch was einfällt, wäre ich für jeden Tip dankbar.
Zusammenfassung: Es geht darum in einem Thread einen Zeiger auf die View zu erstellen, ohne dass bei Programmausführung dann ein Debug Assertion Fehler kommt. Ich hoffe, dass ich das Problem so richtig beschrieben habe.

Vielen Dank im Voraus

Dirk
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
09.06.2003, 11:35 Uhr
Uwe
C/C++ Master
(Administrator)


Hallo,
bin heute erst dazu gekommen die Problematik zu prüfen.
Der Zeiger wird bei mir ordnungsgemäß verarbeitet.
StdAfx.h

C++:
#define WM_THREAD_FINISHED WM_USER+0x100

static UINT ThreadFunc(LPVOID pParam);

int Prim(int nMax);

typedef struct tagTHREADPARMS{
    int nMax;
    HWND hWnd;
}THREADPARMS;


MainFrame.cpp

C++:
void CMainFrame::OnTestPrim()
{
    CFrameWnd* pMain = (CFrameWnd*)AfxGetApp()->m_pMainWnd;
    CView* pView = pMain->GetActiveView( );
    int nMax = pView->GetDlgItemInt(IDC_MAX);
    if(nMax < 10 ){
        MessageBox(_T("Die eigegebene Zahl muß größer oder gleich 10 sein"));
        pView->GetDlgItem(IDC_MAX)->SetFocus();// CEdit
        return;
    }
    pView->SetDlgItemText(IDC_RESULT,_T("")); //CEdit
    THREADPARMS* ptp = new THREADPARMS;
    ptp->nMax = nMax;
    

    ptp->hWnd = m_hWnd;
    AfxBeginThread(ThreadFunc,ptp);    
}

UINT ThreadFunc(LPVOID pParam){
    CFrameWnd* pMain = (CFrameWnd*)AfxGetApp()->m_pMainWnd;
    CView* pView = pMain->GetActiveView( );
    //CDocument* pDoc = pMain->GetActiveDocument( );
    THREADPARMS* ptp = (THREADPARMS*) pParam;
    int nMax = ptp->nMax;
    HWND hWnd = ptp->hWnd;
    delete ptp;

    int nCount = Prim(nMax);

    pView->PostMessage(WM_THREAD_FINISHED,(WPARAM) nCount,0);
    return 0;
}

int Prim (int nMax){
    PBYTE pBuffer = new BYTE[nMax + 1];
    ::FillMemory (pBuffer, nMax + 1, 1);

    int nLimit = 2;
    while (nLimit * nLimit < nMax)
        nLimit++;

    for (int i=2; i<=nLimit; i++) {
        if (pBuffer[i]) {
            for (int k=i + i; k<=nMax; k+=i)
                pBuffer[k] = 0;
        }
    }

    int nCount = 0;
    for (i=2; i<=nMax; i++)
        if (pBuffer[i])
            nCount++;

    delete[] pBuffer;
    return nCount;
}


PrimThreadView.h

C++:
#include "PrimThreadDoc.h"
//.......
//.......
public:

// Überladungen
    // Vom Klassenassistenten generierte Überladungen virtueller Funktionen
    //{{AFX_VIRTUAL(CPrimThreadView)
    public:
    virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV-Unterstützung
    virtual void OnInitialUpdate(); // das erste mal nach der Konstruktion aufgerufen
    virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);
    virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);
    virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);
    virtual void OnPrint(CDC* pDC, CPrintInfo* pInfo);
    //}}AFX_VIRTUAL
    afx_msg LONG OnThreadFinished(WPARAM , LPARAM );
// Implementierung
//......
//......



PrimThreadView.cpp

C++:
BEGIN_MESSAGE_MAP(CPrimThreadView, CFormView)
    //{{AFX_MSG_MAP(CPrimThreadView)
        // HINWEIS - Hier werden Mapping-Makros vom Klassen-Assistenten eingefügt und entfernt.
        //    Innerhalb dieser generierten Quelltextabschnitte NICHTS VERÄNDERN!
    //}}AFX_MSG_MAP
    // Standard-Druckbefehle
    ON_COMMAND(ID_FILE_PRINT, CFormView::OnFilePrint)
    ON_COMMAND(ID_FILE_PRINT_DIRECT, CFormView::OnFilePrint)
    ON_COMMAND(ID_FILE_PRINT_PREVIEW, CFormView::OnFilePrintPreview)
    ON_MESSAGE (WM_THREAD_FINISHED,OnThreadFinished)
END_MESSAGE_MAP()
//..........
//..........
LONG CPrimThreadView::OnThreadFinished(WPARAM wParam, LPARAM lParam){
    SetDlgItemInt(IDC_RESULT,(int)wParam);
    return 0;
}


Das beim auskommentieren von //CDocument* pDoc = pMain->GetActiveDocument(); ein Fehler geworfen wird ist logisch, da
void CWnd::AssertValid() const nicht inline ist(ASSERT((CWnd*)p == this);// Hier kracht'S). Wenn Du einen Zeiger auf das Document brauchst mußt Du dir eine inline wrapper Funktion schreiben. (Keine Fehlerbehandlung im Beispiel)
--
"Es ist schwierig, ein Programm wirklich idiotensicher zu machen, weil Idioten so genial sind."

Bis dann...
Uwe
 
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: