声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2436|回复: 13

[综合讨论] 程序不能正常退出while循环的问题

[复制链接]
发表于 2007-10-19 21:46 | 显示全部楼层 |阅读模式

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

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

x
刚刚遇到的,想不到什么好的办法:@L 。路过的高手指点一下:
  1. clear all;
  2. h=figure('NumberTitle','off','Name','动画演示',...
  3.     'MenuBar','none','color','c');
  4. set(h,'doublebuffer','on');
  5. while ishandle(h)
  6.     x=rand;
  7.     y=rand;
  8.     imshow(imread('cameraman.tif'),[]);
  9.     hold on;
  10.     x1=rand;y1=rand;
  11.     plot(255*[x,x1],255*[y,y1],'r','linewidth',2);
  12.     x=x1;y=y1;pause(0.2);
  13.     %title('动态画线');
  14.     drawnow;
  15. end
复制代码
画线程序并非原创,是luobo前辈的程序。我做了修改,想在窗口被关闭的情况下退出循环。后来发现如果在plot之后加上title、label等标注的语句后,程序就没法退出。关了还自动生成,需要关很多次才会退出(有时甚至退不出来)。上边的代码我把title那句注释掉了,因此大家可以放心试。

想知道,如果有了title等标注语句。如何正确的退出while循环?

[ 本帖最后由 花如月 于 2007-10-19 21:48 编辑 ]
回复
分享到:

使用道具 举报

发表于 2007-10-19 22:23 | 显示全部楼层
应该是那两个语句的顺序问题
clear all;
h=figure('NumberTitle','off','Name','动画演示',...
    'MenuBar','none','color','c');
set(h,'doublebuffer','on');
while ishandle(h)
    x=rand;
    y=rand;
    imshow(imread('cameraman.tif'),[]);
    hold on;
    x1=rand;y1=rand;
    plot(255*[x,x1],255*[y,y1],'r','linewidth',2);
    x=x1;y=y1;
    title('动态画线');
    pause(0.2);
    drawnow;
   
end

[ 本帖最后由 jimin 于 2007-10-19 22:25 编辑 ]
 楼主| 发表于 2007-10-19 22:32 | 显示全部楼层

回复 #2 jimin 的帖子

多谢指点,不过问题很奇怪的。
clear all;
h=figure('NumberTitle','off','Name','动画演示',...
    'MenuBar','none','color','c');
set(h,'doublebuffer','on');
while ishandle(h)
    x=rand;
    y=rand;
    imshow(imread('cameraman.tif'),[]);
    hold on;
    x1=rand;y1=rand;
    plot(255*[x,x1],255*[y,y1],'r','linewidth',2);
    x=x1;y=y1;%pause(0.2);
    title('动态画线');
    drawnow;
end
把pause注释掉也没问题了,不知道原因何在啊:@L。加上pause那句问题就来了

[ 本帖最后由 花如月 于 2007-10-19 22:34 编辑 ]
 楼主| 发表于 2007-10-22 17:53 | 显示全部楼层
问题还是没解决掉,顶起来,等待高手解疑:loveliness:
发表于 2007-10-22 20:28 | 显示全部楼层
pause(0.0001);
    title('动态画线');

大部分不会出错;
原因:pause得太久,窗口关掉了,又title,ishandle(h)=1;自然无限循环.

补充:整个过程,无论窗口是否关闭,h都是等于1。不同的是:关闭窗口ishandle(h)=0;这个函数能分辨是否关闭了窗口。

用下面的调试程序,可以得到:
在两次keyboard时关掉窗口,输入ishandle(h),并且程序可以正常停止,原因是你在title前关的无效,title后关,就可以正常跳出循环,如果pause得太慢,你是大部分关在title前,太快大部分关在title后,故而会出现几率性跳出循环,只是大小不一样。建议pause()语句挪到title后就不会出错。

clear all;
h=figure('NumberTitle','off','Name','动画演示',...
    'MenuBar','none','color','c');
set(h,'doublebuffer','on');
while ishandle(h)
    x=rand;
    y=rand;
    imshow(imread('cameraman.tif'),[]);
    hold on;
    x1=rand;y1=rand;
    plot(255*[x,x1],255*[y,y1],'r','linewidth',2);
    x=x1;y=y1;pause(2);keyboard
    title('动态画线');keyboard
    drawnow;
end

[ 本帖最后由 donkeyxu 于 2007-10-22 22:31 编辑 ]
 楼主| 发表于 2007-10-22 20:46 | 显示全部楼层
好像不是那个原因,如果关了。title开的是个新窗口,句柄不会是h的。谢谢你
发表于 2007-10-22 21:19 | 显示全部楼层


虽然用户关闭了 figure,但是由于 title 函数执行时候需要一个 figure 作为载体,所以会重新产生一个 figure,而且句柄还是 h(这个估计类似随机数生成原理,只要不改变种子,每次生成的随机数都一样)
 楼主| 发表于 2007-10-23 15:04 | 显示全部楼层
谢谢eight,jimin ,donkeyxu 。问题已经解决,你们说得都对。我最把所有的标注修饰语句都放到while循环的外边了,里边只放个绘图函数就可以了:@)

另外想请教下eight,这种功能除了用while循环。还有没有其他的办法?

[ 本帖最后由 花如月 于 2007-10-25 13:02 编辑 ]
发表于 2007-10-23 15:29 | 显示全部楼层
原帖由 花如月 于 2007-10-23 15:04 发表
谢谢eight,jimin ,donkeyxu 。问题已经解决,你们所得都对。我最把所有的标注修饰语句都放到while循环的外边了,里边只放个绘图函数就可以了:@)

另外想请教下eight,这种功能除了用while循环。还有没有其 ...

估计只能用 while 循环
 楼主| 发表于 2007-10-23 15:33 | 显示全部楼层
嗯,我对矢量化编程掌握得很差。你的帖子我看几遍了,还是学不好:@L

[ 本帖最后由 eight 于 2007-10-23 15:36 编辑 ]
发表于 2007-10-23 15:37 | 显示全部楼层
原帖由 花如月 于 2007-10-23 15:33 发表
嗯,我对矢量化编程掌握得很差。你的帖子我看几遍了,还是学不好:@L

慢慢学吧,这是学习的过程,我自己也不是很熟练,长时间不用的话也很容易忘记。学习一定要积累的、不断重复的

[ 本帖最后由 eight 于 2007-10-23 17:06 编辑 ]
发表于 2007-10-25 12:30 | 显示全部楼层

7.5版试了,正常退出

有没title都能正常退出
发表于 2007-10-25 12:51 | 显示全部楼层
版本问题?:@L :@L
 楼主| 发表于 2007-10-25 13:03 | 显示全部楼层
可能吧,我用的7.0(R14)
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-9-23 23:32 , Processed in 0.067769 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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