Dialog的一个button如何控制程序的进度,例如暂停,继续等,求大神指导

lgchaoyangde 2012-08-09 07:49:17
小弟是个小白,现在有这样的需求。

在一个(1.cpp中)dialog上有一个button。在OnButton2() 函数里,调用一个函数simulation(******此函数在2.cpp中)开始仿真,我现在想通过这个button来控制仿真的进度。

比如刚开始button的名称是“开始仿真”,第一次点击后变成“暂停”,此时再次点击应该能够暂停正在运行的程序,小弟不知道如何才能做到?接下来点击“暂停”后,名称变成“继续”,此时点击“继续”,程序接着上次的暂停点继续运行。

不知道我这样描述是否清楚?希望我CSDN大论坛的大神们帮帮我~谢谢~
...全文
295 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
头头 2012-10-14
  • 打赏
  • 举报
回复
多线程 不然高不了
Eleven 2012-09-22
  • 打赏
  • 举报
回复
用线程,可以用利用事件对象来控制线程做事~
Afterwards_ 2012-09-22
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 的回复:]

中间那个settimmer(1,100,0)麻烦解释一下!引用 7 楼 的回复:
动作的正常执行,也就是你的 simulation 放在 OnTimer 里面调用.
开始:SetTimer
中断:KillTimer
继续执行时,再次启动这个定时器.也就是继续调用simulation

一个按钮控制开关
在函数外定义全局 bool b_onoff = 0;
OnButton你的函……
[/Quote]

第一参数 定时器编号 第二参数 每100毫秒执行一次
oyljerry 2012-09-19
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 的回复:]
引用 14 楼 的回复:
你搜索下怎么创建一个线程,就会明白了,线程会有个函数入口,只需要调用simulation就行。

引用 13 楼 的回复:

引用 9 楼 的回复:
仿真操作封装成一个线程,按钮执行将该线程挂起、恢复操作。

您好,如何将仿真操作封装成一个线程呢?有这方面的具体的例子吗?


大虾,帮我大概写一下吧,实在不理解。就拿simulation这个函数来说,……
[/Quote]
可以放到线程中,然后线程函数循环中增加一些标志位来判断当前是否需要暂停,停止,以及启动
  • 打赏
  • 举报
回复
中间那个settimmer(1,100,0)麻烦解释一下![Quote=引用 7 楼 的回复:]
动作的正常执行,也就是你的 simulation 放在 OnTimer 里面调用.
开始:SetTimer
中断:KillTimer
继续执行时,再次启动这个定时器.也就是继续调用simulation

一个按钮控制开关
在函数外定义全局 bool b_onoff = 0;
OnButton你的函数里面做这样的动作
void OnButton()
{
b_onoff = !……
[/Quote]
suiyuan1767 2012-08-14
  • 打赏
  • 举报
回复
可以使用事件,当点击按钮就置有信号。在工作现成里等待这个信号,等到暂停信号时就暂停,等到继续信号时就继续进行。
副组长 2012-08-13
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]
引用 6 楼 的回复:
在OnButton2() 函数里调用simulation感觉不是很好。每次调用都是断下来重新调用不好控制。
建议你的simulation是在父窗口或者后台,设计两种状态。一种是挂起状态,程序停下来时将现场妥善保存,另一种状态是执行,恢复现场状态接着上次的断点执行。
在会话框的按钮响应程序里,除了更改Button上的文字外,设置一个开关量表示挂起或者继续,或者向simu……
[/Quote]
不需要,如果你是一个窗口程序,在主窗口里面直接就运行或者挂起simulation,将simulation运行到什么位置等参数一并保存在主窗口程序里面。然后做一个子窗口程序,比方非模态对话框,对话框上放这个按钮,按下按钮的时候给主窗口发一个消息,主窗口接到这个消息来决定继续运行模拟还是挂起。
Afterwards_ 2012-08-10
  • 打赏
  • 举报
回复
动作的正常执行,也就是你的 simulation 放在 OnTimer 里面调用.
开始:SetTimer
中断:KillTimer
继续执行时,再次启动这个定时器.也就是继续调用simulation

一个按钮控制开关
在函数外定义全局 bool b_onoff = 0;
OnButton你的函数里面做这样的动作
void OnButton()
{
b_onoff = ! b_onoff;
if(b_onoff)
{SetTimmer(1,100,0);return;}
eles
{KillTimer(1);return;}
}
这样就可以点一次开始 再点一次暂停了.
另外在里面加上按钮的改变文字函数 加入后 如下

void OnButton()
{
b_onoff = ! b_onoff;
if(b_onoff)
{
SetTimmer(1,100,0);
SetDlgItemText(m_hwnd, IDC_YOURBUTTON, L"名字1");
return;
}
eles
{
KillTimer(1);
SetDlgItemText(m_hwnd, IDC_YOURBUTTON, L"名字2");
return;
}
}


另外你说到 要最开始有一个开始仿真的功能 开始你可以做一个函数专门来初始化仿真环境和各种准备工作
在窗口的初始化过程中先把你的按钮名字设置好 或者在资源视图里面编辑好.
判断是否已经开始了这个动作 也是可以定义一个全局 bool b_state = 0;
点击按钮的函数里面设置一个if来判断
if(0 == b_state)
{
//还没开始,那么初始化
......你的代码
b_state = 1;//这就表明你的动作已经开始了.
}
//下面不用添加else 程序如果检测到状态是1 那么就自动执行下面的代码了
.........你的代码
把这个if也放到你的OnButton函数实现内的顶部

如上 个人一点想法 做过类似的.给你点参考,剩下的就是关于时间函数的控制了.另外就是你的进度的保存
liliboy9527 2012-08-10
  • 打赏
  • 举报
回复
你搜索下怎么创建一个线程,就会明白了,线程会有个函数入口,只需要调用simulation就行。
[Quote=引用 13 楼 的回复:]

引用 9 楼 的回复:
仿真操作封装成一个线程,按钮执行将该线程挂起、恢复操作。

您好,如何将仿真操作封装成一个线程呢?有这方面的具体的例子吗?
[/Quote]
lgchaoyangde 2012-08-10
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]
仿真操作封装成一个线程,按钮执行将该线程挂起、恢复操作。
[/Quote]
您好,如何将仿真操作封装成一个线程呢?有这方面的具体的例子吗?
lgchaoyangde 2012-08-10
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
两种方式,
1、将仿真程序做到线程函数中,通过挂起线程函数来中断仿真程序运行
2、设置状态参数,如switch case,或干脆用
bool参数表示当前程序的状态,通过在OnButton中判断该参数值来分辨程序状态---只有程序开始时,button上是“开始”,点击后,按钮的文字只会是“暂停”或“继续”两种状态。
[/Quote]
您好,我觉得你和9楼说的方法一样,将“仿真程序做到线程函数中”应该如何做?有这方面的事例吗?
lgchaoyangde 2012-08-10
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
在OnButton2() 函数里调用simulation感觉不是很好。每次调用都是断下来重新调用不好控制。
建议你的simulation是在父窗口或者后台,设计两种状态。一种是挂起状态,程序停下来时将现场妥善保存,另一种状态是执行,恢复现场状态接着上次的断点执行。
在会话框的按钮响应程序里,除了更改Button上的文字外,设置一个开关量表示挂起或者继续,或者向simulation发消息,sim……
[/Quote]

您好~我大概能明白你的意思,而且我也觉得你的方法很正确。能不能说的更详细点?我的理解是现在需要两个进程吗?需要进程和进程之间通信,是吗?
淡定的飘着 2012-08-10
  • 打赏
  • 举报
回复
自己用一个状态改变状态的值就可以了
alexander_david 2012-08-10
  • 打赏
  • 举报
回复
仿真操作封装成一个线程,按钮执行将该线程挂起、恢复操作。
fronz 2012-08-10
  • 打赏
  • 举报
回复
两种方式,
1、将仿真程序做到线程函数中,通过挂起线程函数来中断仿真程序运行
2、设置状态参数,如switch case,或干脆用
bool参数表示当前程序的状态,通过在OnButton中判断该参数值来分辨程序状态---只有程序开始时,button上是“开始”,点击后,按钮的文字只会是“暂停”或“继续”两种状态。
Afterwards_ 2012-08-10
  • 打赏
  • 举报
回复
CreateThread
lgchaoyangde 2012-08-10
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 的回复:]
你搜索下怎么创建一个线程,就会明白了,线程会有个函数入口,只需要调用simulation就行。

引用 13 楼 的回复:

引用 9 楼 的回复:
仿真操作封装成一个线程,按钮执行将该线程挂起、恢复操作。

您好,如何将仿真操作封装成一个线程呢?有这方面的具体的例子吗?
[/Quote]

大虾,帮我大概写一下吧,实在不理解。就拿simulation这个函数来说,这个函数也许要运行1个小时。我怎么能把他封装到线程里,并控制它暂停,继续?能具体写点代码吗?
副组长 2012-08-09
  • 打赏
  • 举报
回复
在OnButton2() 函数里调用simulation感觉不是很好。每次调用都是断下来重新调用不好控制。
建议你的simulation是在父窗口或者后台,设计两种状态。一种是挂起状态,程序停下来时将现场妥善保存,另一种状态是执行,恢复现场状态接着上次的断点执行。
在会话框的按钮响应程序里,除了更改Button上的文字外,设置一个开关量表示挂起或者继续,或者向simulation发消息,simulation收到消息后决定继续还是暂停。
傻X 2012-08-09
  • 打赏
  • 举报
回复
要用switch(flag)了。

case 1:初始化:button.SetWindowText(“开始仿真”);flag = 2;

case 2:按钮触发工作线程:button.SetWindowText("暂停"); (本来想用触发函数的,后来想有暂停,工作应该很长,用线程不然会卡死界面线程的) flag = 3;

case 3:按钮挂起工作线程button.SetWindowText("继续"); flag = 2;


工作线程结束SendMessage主界面,button.SetWindowText("开始仿真") flag = 1;
lgchaoyangde 2012-08-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
CWnd::SetDlgItemText
void SetDlgItemText( int nID, LPCTSTR lpszString );
==================
如:SetDlgItemText(ID_BTN1,"暂停");
[/Quote]

呃~这个我会,你可能没有理解我的意思,我的重点是如何通过button控制程序的执行
加载更多回复(3)

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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