怎么退出循环?

riding 2007-03-17 06:39:07
界面上有2个按钮, 一个叫循环,按下后程序进入死循环,另一个按钮叫退出,按下后先前的死循环应当退出,怎么编写这两个事件程序?
...全文
633 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
riding 2007-08-15
  • 打赏
  • 举报
回复
呵呵,看来大家理解消息机制还不够。当然多线程是可以的。 将windows PeekMassage() 和TranslateMassage()函数放在循环中间,另一个按钮就有机会获得控制权,在VB中还可以使用doEvent.
dzq138 2007-03-19
  • 打赏
  • 举报
回复
pCCJRDlg都改为你对话框中的pxxxRDlg !!!
因为我的对话框为pCCJRDlg,所以工作线程中有两个地方没改过来.
linchunfu 2007-03-19
  • 打赏
  • 举报
回复
多线程
jjkezl 2007-03-19
  • 打赏
  • 举报
回复
dzq138(钟添)果然是个很严谨的人呢.说的很详细,不错.
zhangyq73 2007-03-19
  • 打赏
  • 举报
回复
用windows的消息机制同样可以,NI的采集卡中的采集函数都是死循环,你可以参照它的例子
dzq138 2007-03-18
  • 打赏
  • 举报
回复
上面工作程中有误:

while(pCCJRDlg->torf) //不等于false则一直工作下去.
改为你对话框中的pxxxRDlg
while(pxxxRDlg->torf) //不等于false则一直工作下去.
dzq138 2007-03-18
  • 打赏
  • 举报
回复
写个最简单线程例子,希望对你有帮助:

头文件中声明线程函数.
这里假设xxxRDlg为对话框类
xxxRDlg.h
static DWORD WINAPI AccountThreadProc(LPVOID lpParameter); //必须声明为静态的线程函数.当然如果是全局的则没这个必要
bool CreateAccountThreadProc(void);//建立计算线程
bool DestroyAccount(void); //强制结束线程函数
HANDLE m_hAccountThread; //用于存放
DWORD m_dwAccountThreadId;

bool torf;//标志,是否退出?

xxxRDlg.cpp


这里假设xxxRDlg为对话框类
调用在适当的地方写上:
torf=true;bool boc=CreateAccountThreadProc();//线程创建并马上开始工作.
要退出则只要在退出代码内加入:
torf=false;


bool xxxRDlg::CreateAccountThreadProc(void)
{//建立计算线程
m_hAccountThread=CreateThread(0,0,xxxRDlg::AccountThreadProc,(LPVOID)this ,0,&m_dwAccountThreadId);//工作线程开始工作
if(!m_hAccountThread)
return FALSE; //不成功
else
return TRUE; //成功
}

bool xxxRDlg::DestroyAccount(void)//强制结束线程函数
{
if(m_hAccountThread)
{
BOOL b=FALSE;
DWORD ExitCode;
int Timeout = 50;
while(Timeout)//等待线程结束,如果到一定时间内没结束,就强制结束
{
GetExitCodeThread(m_hAccountThread, &ExitCode);

if (ExitCode != STILL_ACTIVE)
{
b=TRUE;
// Thread has ended.
break;
}
else
{
Sleep(10);
}
--Timeout;
}
if(!b)//time out ,terminate it
TerminateThread(m_hAccountThread,0);
}
m_hAccountThread=NULL;
return TRUE;
}


DWORD WINAPI xxxDlg::AccountThreadProc(LPVOID lpParameter)
{ //计算工作线程]
xxxRDlg* pxxxRDlg=(xxxRDlg*)lpParameter;
//要用这个Dlg的变量或什么的可用这个"pxxxRDlg->"得到.
CButton *Account =(CButton*)pCCJRDlg->GetDlgItem(IDOK);//这里比如IDOK按钮为开始工作
Account->EnableWindow(0); //按钮无效 ,防止多次启动线程.
while(pCCJRDlg->torf) //不等于false则一直工作下去.
{
::Sleep(1000); //休1000毫秒,测试效果

}
Account->EnableWindow(1); //按钮有效
}
olncy 2007-03-18
  • 打赏
  • 举报
回复
是啊,多线程是关键
rdsnow 2007-03-17
  • 打赏
  • 举报
回复
多线程,否则程序会一直停留在循环中而无法处理退出按钮的消息。
kbsoft 2007-03-17
  • 打赏
  • 举报
回复
点击"循环"按钮时,生成一个线程来处理.点击"退出"按钮时,给循环线程发一个停止信号
kangji 2007-03-17
  • 打赏
  • 举报
回复
用线程比较好

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧