MFC素数查找

来源:互联网 发布:java api文档中文pdf 编辑:程序博客网 时间:2024/05/05 11:15
CMyApp app;BOOL CMyApp::InitInstance(){m_pMainWnd=new CMainWnd;m_pMainWnd->ShowWindow(m_nCmdShow);m_pMainWnd->UpdateWindow();return true;}BEGIN_MESSAGE_MAP(CMainWnd,CFrameWnd)ON_WM_ERASEBKGND()ON_MESSAGE(WM_USER_THREAD_FINISHED,OnThreadFinished)ON_BN_CLICKED(IDC_START,OnStart)END_MESSAGE_MAP()CMainWnd::CMainWnd(){Create(NULL,"素数查找",WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX,CRect(0,0,300,300));GetClientRect(&m_rect);CPoint pt(m_rect.Width()/2,m_rect.Height()/2);CRect rectstart(pt.x-50,pt.y+50,pt.x+50,pt.y+80);m_start.Create("开始",WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,rectstart,this,IDC_START);//在这些个参数中,控件ID是自己#define的,矩///形的范围是left x top 上y right x bottom 下y CRect rectstatic(pt.x-80,pt.y,pt.x+80,pt.y+20);m_static.Create("",WS_CHILD|WS_VISIBLE,rectstatic,this,IDC_RESULT);CRect rectedit(pt.x-80,pt.y-50,pt.x+80,pt.y-30);m_edit.Create(WS_CHILD|WS_VISIBLE,rectedit,this,IDC_NUMBER); }//这个函数是响应消息WM_ERASEBKGND消息,来擦除windows界面背景的BOOL CMainWnd::OnEraseBkgnd(CDC* pDC) { CBrush brush;brush.CreateSolidBrush(RGB(152,152,152));pDC->FillRect(&m_rect,&brush);pDC->Draw3dRect(&m_rect,RGB(192,192,192),RGB(100,100,100));return TRUE; } //这个函数是响应按钮消息ON_BN_CLICKEDvoid CMainWnd::OnStart(){int max=GetDlgItemInt(IDC_NUMBER);node *param=new node;param->max=max;param->result=0;param->hwnd=m_hWnd;(CButton*)GetDlgItem(IDC_START)->EnableWindow(false);//将按钮设置为无效因为在计算素数::AfxBeginThread(Sieve,(LPVOID)param);}//这个函数就是连接PostMessage的消息函数LONG CMainWnd::OnThreadFinished(WPARAM wParam,LPARAM lParam){(CButton*)GetDlgItem(IDC_START)->EnableWindow(true);CString str;SetDlgItemInt (IDC_RESULT, ((node*) wParam)->result);//把这个控件值设为应赋予的值return 0;}//求素数的方法,如9以内,2,3,5,7是素 数,UINT CMainWnd::Sieve(LPVOID param)//不需要求余,很少的2次循环{node *pnode=(node*)param;int max=pnode->max;bool *isprime=new bool[max+1];  //先假设所有数都是素数for(int i=0;i<=max;++i)isprime[i]=true;int nLimit=2;for(;nLimit*nLimit<max;nLimit++); //找到可以被倍数的最大数字 for(i=2;i<=nLimit;++i){if(isprime[i]){for(int j=i+i;j<=max;j+=i) //因为他们都是这个基数的倍数,2倍,3倍,4倍,所以可以被整除,因此不是素数 isprime[j]=false;}}for(int count=0,z=2;z<=max;++z)if(isprime[z])++count;delete []isprime;pnode->result=count;::PostMessage(pnode->hwnd, WM_USER_THREAD_FINISHED,(WPARAM)pnode,0);return 0;}


我们可以从上述代码中可以看出,::AfxBeginThread有两个函数调用,一个是UI线程,即线程自带一个窗口,CRusnTimeClass*,一个是工作者线程,UINT func(LPVOID),我们使用的是工作者线程,在线程结尾时,我们选择PostMessage来传递值,PostMessage需要我们自定义一个消息,需要至少是WM_USER+100,然后用ON_MESSAGE将这个消息与函数连接,这样postmessage消息时就可以调用这个函数,这里只包含了.cpp文件.h文件可以在前面的mfc代码中查找

 

 

 

 

 

 

 

 

 

0 0
原创粉丝点击