MFC素数查找

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_CLICKED
void 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代码中查找

猜你喜欢

转载自blog.csdn.net/anzijian1993/article/details/38335747