从静态到动态
在学习画图板的时候,我自己用了一段时间绘制出了一个小球,如若想使小球运动起来,正好可以将上篇博文说的线程类运用起来——在这里,我想让小球一直运行下去而不停止,并且能够手动的控制小球动作(暂停或者恢复运动)。
/** * 重写Thread类的run方法 */ public void run() { // 绘制移动的球体 while (true) { // 如果被暂停,一直循环执行休眠操作,不进行后面的移动操作 if (pauseflag) { continue; } // 跳出线程的方法 if (stopflag) { return; } // 设定横纵向的递增量的正负号 if (y >= jp.getHeight() - size) { tempy = -Math.abs(tempy); } else if (y <= 37) { tempy = Math.abs(tempy); } if (x >= jp.getWidth() - size + 12) { tempx = -Math.abs(tempx); } else if (x <= 15) { tempx = Math.abs(tempx); } // 将上一个球体擦掉 clear(x - size / 6 - 1, y - size / 6 - 1, size); // 改变球体的当前位置 x += tempx; y += tempy; // 绘制当前球体 ball(x, y, red, green, blue, size); // 休眠 try { Thread.sleep(30); } catch (InterruptedException e) { e.printStackTrace(); } } }
结果发现了这样一个问题,当点击“暂停”时,小球确实能够暂停,但是点击“继续”时,小球仍为暂停状态。经查阅书籍发现:每个线程都有一个独立的程序计数器(PC寄存器,当线程执行一个方法时,程序计数器指向方法区中下一条要执行的字节码指令)和方法调用栈(用来跟踪线程运行中一系列的方法调用过程,栈中元素称为栈帧——帧用来存储方法的参数、局部变量和运算过程中的临时数据)。也就是说,在监听器更改的值,是线程对象内存中的值,但是存储在线程中的变量pauseflag此时运用的是其寄存器中的值,因两者之间无交互,因而程序运行效果有些不同。
当我将代码改成如下状态时:
/** * 重写Thread类的run方法 */ public void run() { // 绘制移动的球体 while (true) { // 休眠 try { Thread.sleep(30); } catch (InterruptedException e) { e.printStackTrace(); } // 如果被暂停,一直循环执行休眠操作,不进行后面的移动操作 if (pauseflag) { continue; } // 跳出线程的方法 if (stopflag) { return; } // 设定横纵向的递增量的正负号 if (y >= jp.getHeight() - size) { tempy = -Math.abs(tempy); } else if (y <= 37) { tempy = Math.abs(tempy); } if (x >= jp.getWidth() - size + 12) { tempx = -Math.abs(tempx); } else if (x <= 15) { tempx = Math.abs(tempx); } // 将上一个球体擦掉 clear(x - size / 6 - 1, y - size / 6 - 1, size); // 改变球体的当前位置 x += tempx; y += tempy; // 绘制当前球体 ball(x, y, red, green, blue, size); } }
在运行线程前将其暂停一会儿,等它再次启动的时候,数据之间又会进行交互,这样,小球的暂停与恢复(继续)就实现了。
相关推荐
静态网页的基础知识,引导入门,从静态到动态的转换动态,CSS页面的布局
linux静态库和动态库的区别
静态路由和动态路由同时存在,怎么使用动态路由和静态路由同时在一个路由上配置。
静态加载动态链接库;LIB静态加载动态链接库
手工聚合、静态lacp、动态lacp差异
webservice的动态调用和静态调用。静态调用是指添加web引用的方式调用。动态调用是指通过反射等方式在代码中加载。
静态、动态sql及各种游标,适合初学者学习
动态Jsp页面转换成静态Html页面动态Jsp页面转换成静态Html页面动态Jsp页面转换成静态Html页面动态Jsp页面转换成静态Html页面动态Jsp页面转换成静态Html页面动态Jsp页面转换成静态Html页面动态Jsp页面转换成静态Html...
测试代码说明以下两个问题:...即:在A是动态库的这种情况下,B和C访问到的X是同一变量。 博文地址:http://blog.csdn.net/guggy/article/details/8136325 或即时记:http://www.livelog.cn/bbs/viewthread.php?tid=16
静态动态.rar静态动态.rar静态动态.rar静态动态.rar静态动态.rar
使用简单的程序展示了C++调用动态库和静态库的方法。 文件结构: exe:笔者部署可运行文件,因开发环境版本不同,可能存在无法直接使用的情况,两个部署文件(copy_ldd.sh及useLib1.sh)可以结合文章分享的(ubuntu下...
静态网页和动态网页的区别 动态网页和静态网页的区别,首先要分别了解两个概念,就是什么是静态网页,什么是动态网页,并且学会区分哪些是静态哪些是动态。 静态网页: (1)静态网页不能简单地理解成静止不动的...
qt5.12.0静态资源包,不支持directx 12版本.因为大部分window7版本以下会无法打开qt应用. 使用方法为: 1.打开最新版visualStudio。创建新工程不打开项目,...动态编译要手东windeoloy ,体积几百M,静态编译只需要10M不到
动态页面生成静态页面实例动态页面生成静态页面实例动态页面生成静态页面实例动态页面生成静态页面实例
在嵌入式Linux下修改文件进行设置开机启动时静态IP或者动态IP
动态网页如何生成伪静态网页动态网页如何生成伪静态网页动态网页如何生成伪静态网页动态网页如何生成伪静态网页动态网页如何生成伪静态网页
静态库的制作:(inc/lib/src/main.c) gcc -c src/*.c(编译src目录下的.c文件生成.o文件) ar rs libmath.a *.o(生成静态库:libmath.a(命名规则:必须以lib开头,以.a结尾,中间是库名:math)) 静态库的使用: gcc main.c -...
当一个程序使用静态链 接库,那么当link的时候,连接器会把所需要的函数拷贝到源程序里面,这样,当编译完以后,静态链接库就可以不需要了。如果一个程序使用动态链接库,那么当 连接的时候,只会在程序里面留下一...
计算机网络的实验报告:静态路由和动态路由。。。。。
图解加说明,实验路由器的动态和静态配置,详细清楚,简单易懂