声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 13641|回复: 26

[GUI界面] 如何在GUI界面中加入一个停止按钮让正在运行的程序终止?

[复制链接]
发表于 2007-9-14 22:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
我写了一个通信系统的仿真程序,后来又做了个GUI界面,目前点“开始”按钮即可运行仿真,但是现在需要在界面上再加一个停止按钮,使得正在运行的程序可以终止。我试了很多方法都没法让他终止,不知道应该如何实现这个功能呢?还请高手指教一下,谢过先!!
回复
分享到:

使用道具 举报

发表于 2007-9-15 10:22 | 显示全部楼层
原帖由 coolshinning 于 2007-9-14 22:20 发表
我写了一个通信系统的仿真程序,后来又做了个GUI界面,目前点“开始”按钮即可运行仿真,但是现在需要在界面上再加一个停止按钮,使得正在运行的程序可以终止。我试了很多方法都没法让他终止,不知道应该如何实 ...


何谓 “正在运行的程序可以终止”?请解释清楚
 楼主| 发表于 2007-9-16 22:34 | 显示全部楼层
点击界面上的“运行仿真”时会调用RUN_Callback函数,在这个函数里面会循环执行一系列我自己写的函数,现在我希望在执行这些函数的时候,如果检测到鼠标点击了界面上的“停止仿真”按钮,则停止执行RUN_Callback函数。现在就是不知道用什么命令能实现检测鼠标是否有点击的操作。
发表于 2007-9-16 23:25 | 显示全部楼层
原帖由 coolshinning 于 2007-9-16 22:34 发表
点击界面上的“运行仿真”时会调用RUN_Callback函数,在这个函数里面会循环执行一系列我自己写的函数,现在我希望在执行这些函数的时候,如果检测到鼠标点击了界面上的“停止仿真”按钮,则停止执行RUN_Callbac ...


检测鼠标是否点击了 停止仿真 这个问题不难,就普通的 callback 函数就可以了,关键是循环那里。可以通过设置一个标记来实现,即点击停止后更新标记,且在循环中检测标记。
 楼主| 发表于 2007-9-17 08:28 | 显示全部楼层
界面上的“运行仿真”和“停止仿真”分别对“RUN_callback”和“STOP_callback”,这两个函数都在自动生成的界面函数文件中(我是用GUIDE来做的界面)。现在我在“STOP_callback”这个函数中加了一个标记stop_label=1,并把stop_label设为全局变量;在“RUN_callback”函数的循环里面增加了“if stop_label=1;break; end”这个语句。但一旦仿真后,点击界面上的停止按钮没有任何反应,仍然停不下来。我想是不是当正在执行“RUN_callback”时,点击界面上的停止按钮并不会中断RUN_callback函数,而优先执行“STOP_callback”函数啊?
发表于 2007-9-17 09:23 | 显示全部楼层
原帖由 coolshinning 于 2007-9-17 08:28 发表
界面上的“运行仿真”和“停止仿真”分别对“RUN_callback”和“STOP_callback”,这两个函数都在自动生成的界面函数文件中(我是用GUIDE来做的界面)。现在我在“STOP_callback”这个函数中加了一个标记stop_l ...


恩,你说的是正确的。看来用我上面所描述的方法不行

我以前倒是做过类似的东东,不过时间太久忘记了如何处理的
 楼主| 发表于 2007-9-17 09:33 | 显示全部楼层
我有一种想法是用,waitbar来做,在waitbar(x,'title','CreateCancelBtn','STOP_callback')中的STOP_callback中的写入"quit",这样进度条上点击退出时可以终止程序,但是直接连matlab一起给关了,:(
发表于 2007-9-17 10:11 | 显示全部楼层
原帖由 coolshinning 于 2007-9-17 09:33 发表
我有一种想法是用,waitbar来做,在waitbar(x,'title','CreateCancelBtn','STOP_callback')中的STOP_callback中的写入"quit",这样进度条上点击退出时可以终止程序,但是直接连matlab一起给关了,:(


对对对,我当时就是用 waitbar 做的。哎,人老了,脑子不灵了。我记得版面讨论过这个问题,我也给出过答案,你自己搜索一下吧
 楼主| 发表于 2007-9-17 15:32 | 显示全部楼层
用waitbar的话,在STOP_callback里面应该怎么写呢?我用quit直接把matlab给关了,有没有什么命令能象ctrl-c一样只是退出当前的程序而不是退出matlab呢?
发表于 2007-9-17 19:24 | 显示全部楼层
原帖由 coolshinning 于 2007-9-17 15:32 发表
用waitbar的话,在STOP_callback里面应该怎么写呢?我用quit直接把matlab给关了,有没有什么命令能象ctrl-c一样只是退出当前的程序而不是退出matlab呢?

  1. h = waitbar(0,'Please wait ...','CreateCancelBtn',@btnWaitbarCancel_Callback,...
  2.      'WindowStyle','Modal');
  3. for j = 1:n
  4.   .....
  5.   if ishandle(h)
  6.     waitbar(j/n);
  7.   else
  8.     return;
  9. end
  10. if ishandle(h)
  11.    delete(h);
  12. end
复制代码
  1. function btnWaitbarCancel_Callback(h,varargin)
  2. %call delete (because close-request function also calls this function)
  3. fig_handle = get(h,'parent');
  4. delete(fig_handle);
复制代码

点评

赞成: 4.0
赞成: 4
eight果然元老级人物啊!!呵呵  发表于 2014-3-28 11:05

评分

2

查看全部评分

 楼主| 发表于 2007-9-17 22:35 | 显示全部楼层
运行了下八哥的程序,在点击cancel后确实能关闭进度条,但是此后RUN_Callback里面的程序仍然会继续运行,直至达到最大的循环次数,有没有办法在关闭进度条的同时让RUN_Callback里面的程序也终止运行呢?
此外,我在书上看到可以通过BusyAction和Interruptible两个属性来的设置实现当在执行一个call_back程序时,通过鼠标操作调用另一个call_back程序实现对第一个call_back的中断,但是我试了很多次都没有能中断RUN_Callback,而是等RUN_Callback执行完了后,才执行STOP_Callback程序,不知道哪有问题呢?
发表于 2007-9-17 23:43 | 显示全部楼层
原帖由 coolshinning 于 2007-9-17 22:35 发表
运行了下八哥的程序,在点击cancel后确实能关闭进度条,但是此后RUN_Callback里面的程序仍然会继续运行,直至达到最大的循环次数,有没有办法在关闭进度条的同时让RUN_Callback里面的程序也终止运行呢?


不可能吧?这段代码我以前使用过,点击 cancel 后既能关闭进度条,又能停止循环的执行,除非因为 CPU 太忙而无法响应用户点击 cancel 这个操作,但是这时候进度条是没有关闭的。

从代码的写法来看,每次循环的时候都会检测进度条的句柄是否存在的,如果不存在,即被关闭,则会执行 return 退出的。你要不再试试,把循环次数加大点,然后在循环开始就马上停止

[ 本帖最后由 eight 于 2007-9-18 09:25 编辑 ]
 楼主| 发表于 2007-9-18 09:11 | 显示全部楼层
可以停止程序的运行。我那个程序可能是因为在RUN_Callback里面的循环内又调用了很多我自己写的子函数,所以一时停不下来。
我现在在RUN_Callback内的每个子函数里面加入一个drawnow的命令,可以实现在点击“停止仿真”时对RUN_Callback的中断,也可以立刻退出程序。

评分

1

查看全部评分

 楼主| 发表于 2007-9-18 09:35 | 显示全部楼层
太谢谢八哥了,终于搞定了呵:lol
发表于 2007-9-18 09:46 | 显示全部楼层

回复 #14 coolshinning 的帖子

貌似八兄比八哥好些:lol ,也可能是习惯不同吧:@D
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-5-3 19:00 , Processed in 0.089744 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表