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