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 |