coolshinning 发表于 2007-9-14 22:20

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

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

eight 发表于 2007-9-15 10:22

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

何谓 “正在运行的程序可以终止”?请解释清楚

coolshinning 发表于 2007-9-16 22:34

点击界面上的“运行仿真”时会调用RUN_Callback函数,在这个函数里面会循环执行一系列我自己写的函数,现在我希望在执行这些函数的时候,如果检测到鼠标点击了界面上的“停止仿真”按钮,则停止执行RUN_Callback函数。现在就是不知道用什么命令能实现检测鼠标是否有点击的操作。

eight 发表于 2007-9-16 23:25

原帖由 coolshinning 于 2007-9-16 22:34 发表 http://www.chinavib.com/forum/images/common/back.gif
点击界面上的“运行仿真”时会调用RUN_Callback函数,在这个函数里面会循环执行一系列我自己写的函数,现在我希望在执行这些函数的时候,如果检测到鼠标点击了界面上的“停止仿真”按钮,则停止执行RUN_Callbac ...

检测鼠标是否点击了 停止仿真 这个问题不难,就普通的 callback 函数就可以了,关键是循环那里。可以通过设置一个标记来实现,即点击停止后更新标记,且在循环中检测标记。

coolshinning 发表于 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”函数啊?

eight 发表于 2007-9-17 09:23

原帖由 coolshinning 于 2007-9-17 08:28 发表 http://www.chinavib.com/forum/images/common/back.gif
界面上的“运行仿真”和“停止仿真”分别对“RUN_callback”和“STOP_callback”,这两个函数都在自动生成的界面函数文件中(我是用GUIDE来做的界面)。现在我在“STOP_callback”这个函数中加了一个标记stop_l ...

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

我以前倒是做过类似的东东,不过时间太久忘记了如何处理的

coolshinning 发表于 2007-9-17 09:33

我有一种想法是用,waitbar来做,在waitbar(x,'title','CreateCancelBtn','STOP_callback')中的STOP_callback中的写入"quit",这样进度条上点击退出时可以终止程序,但是直接连matlab一起给关了,:(

eight 发表于 2007-9-17 10:11

原帖由 coolshinning 于 2007-9-17 09:33 发表 http://www.chinavib.com/forum/images/common/back.gif
我有一种想法是用,waitbar来做,在waitbar(x,'title','CreateCancelBtn','STOP_callback')中的STOP_callback中的写入"quit",这样进度条上点击退出时可以终止程序,但是直接连matlab一起给关了,:(

对对对,我当时就是用 waitbar 做的。哎,人老了,脑子不灵了。我记得版面讨论过这个问题,我也给出过答案,你自己搜索一下吧

coolshinning 发表于 2007-9-17 15:32

用waitbar的话,在STOP_callback里面应该怎么写呢?我用quit直接把matlab给关了,有没有什么命令能象ctrl-c一样只是退出当前的程序而不是退出matlab呢?

eight 发表于 2007-9-17 19:24

原帖由 coolshinning 于 2007-9-17 15:32 发表 http://www.chinavib.com/forum/images/common/back.gif
用waitbar的话,在STOP_callback里面应该怎么写呢?我用quit直接把matlab给关了,有没有什么命令能象ctrl-c一样只是退出当前的程序而不是退出matlab呢?
h = waitbar(0,'Please wait ...','CreateCancelBtn',@btnWaitbarCancel_Callback,...
   'WindowStyle','Modal');
for j = 1:n
.....
if ishandle(h)
    waitbar(j/n);
else
    return;
end
if ishandle(h)
   delete(h);
endfunction btnWaitbarCancel_Callback(h,varargin)
%call delete (because close-request function also calls this function)
fig_handle = get(h,'parent');
delete(fig_handle);

coolshinning 发表于 2007-9-17 22:35

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

eight 发表于 2007-9-17 23:43

原帖由 coolshinning 于 2007-9-17 22:35 发表 http://www.chinavib.com/forum/images/common/back.gif
运行了下八哥的程序,在点击cancel后确实能关闭进度条,但是此后RUN_Callback里面的程序仍然会继续运行,直至达到最大的循环次数,有没有办法在关闭进度条的同时让RUN_Callback里面的程序也终止运行呢?


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

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

[ 本帖最后由 eight 于 2007-9-18 09:25 编辑 ]

coolshinning 发表于 2007-9-18 09:11

可以停止程序的运行。我那个程序可能是因为在RUN_Callback里面的循环内又调用了很多我自己写的子函数,所以一时停不下来。
我现在在RUN_Callback内的每个子函数里面加入一个drawnow的命令,可以实现在点击“停止仿真”时对RUN_Callback的中断,也可以立刻退出程序。

coolshinning 发表于 2007-9-18 09:35

太谢谢八哥了,终于搞定了呵:lol

花如月 发表于 2007-9-18 09:46

回复 #14 coolshinning 的帖子

貌似八兄比八哥好些:lol ,也可能是习惯不同吧:@D
页: [1] 2
查看完整版本: 如何在GUI界面中加入一个停止按钮让正在运行的程序终止?