给你个简单的小例子吧实现你的功能。
1、建立一个MFC工程,上面放2个按钮:第一个按钮是启动循环;第二个按钮是结束循环;
2、步骤:
①
// CreateThreadexDlg.cpp : 实现文件
//
#include "stdafx.h"
#include "CreateThreadex.h"
#include "CreateThreadexDlg.h"
#include "afxdialogex.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
bool bInLoop = true;//------------>定义一个全局变量用于控制循环
// 用于应用程序“关于”菜单项的 CAboutDlg 对话框
class CAboutDlg : public CDialogEx
{
public:
CAboutDlg();
...
②在第一个按钮(启动循环)事件里面加入如下代码:
//单击此按钮启动一个线程用于实现循环
void CCreateThreadexDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)startlop,NULL,0,0);
}
③在第一个按钮上面定义一个线程函,此函数用于当满足条件实现死循环,不满足条件跳出循环从而关闭线程;
LPTHREAD_START_ROUTINE startlop(void*)
{
while (bInLoop)//逻辑条件
{
MessageBoxW(NULL,L"hello",L"test",MB_OK);
Sleep(2000);
}
return 0;
}
3、关闭循环,点击此按钮将全局变量赋予假,则结束循环
void CCreateThreadexDlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码
bInLoop=false;
}
很简单的一个线程例子,当然方法众多,希望对初学的你有帮助,请采纳,谢谢
不要再MFC的窗口及空间里使用线程等待,那样会阻止MFC本身的窗口线程的消息分发,请自行创建个线程或者WM_TIMER来做处理。
这里有个WTL的滚动进度条控件,里面用了WM_TIMER来做线程,持续不断的刷新进度条,当按钮点击停止后,也会停掉滚动条的动画。WTL和MFC是相通的,你可以将里面的关键点,移植到MFC上面。
http://blog.csdn.net/renstarone/article/details/9230763
bInLoop=TRUE;
CWinThread* pct = AfxGetThread();
while(bInLoop)
{
MSG m;
while (::PeekMessage(&m, 0, 0, 0, PM_NOREMOVE) != 0)
pct->PumpMessage();
//一个事件。。。。。。。。。。。。。
};
改成这样看看?不过Button2被点击之前,你的程序很可能无法退出(就是点x退不掉)
这里给出两种方法,一种是使用Timer,然后在OnTimer函数里面做自己的事情。
另外一个是定义一个线程函数:
UINT __cdecl MyControllingFunction( LPVOID pParam );
注意这个函数只能是全局函数或者是类的静态函数,不能为类的成员函数,
然后使用AfxBeginThread启动线程。
详细参考附件
另开一个线程到时可以,不过这个createthread函数(启动线程函数)应该放在BUTTON1里然后你BUTTON1里的循环放在线程函数里,BUTTON2控制bInLoop真假来结束你的线程里的循环。
如果不开一个线程其实也可以那就是重载run()函数,部分代码
for (;;)
{
if(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
{
do //if there is pump all waiting
{
if ( !PumpMessage() )
return ExitInstance();
} while (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE));
}
else if (AfxGetMainWnd()->IsIconic())
{
WaitMessage();
}
///你的while循环改成if
if(bInLoop)
{
/////////////////BUTTON1设置bInLoop为真BUTTON2设置bInLoop为假。
}
}