`
殇瓶-MIN
  • 浏览: 8475 次
  • 性别: Icon_minigender_2
  • 来自: 长沙
社区版块
存档分类
最新评论

从静态到动态

阅读更多

 

从静态到动态

 

在学习画图板的时候,我自己用了一段时间绘制出了一个小球,如若想使小球运动起来,正好可以将上篇博文说的线程类运用起来——在这里,我想让小球一直运行下去而不停止,并且能够手动的控制小球动作(暂停或者恢复运动)。 

 

/**
	 * 重写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);
		}
	}

 

在运行线程前将其暂停一会儿,等它再次启动的时候,数据之间又会进行交互,这样,小球的暂停与恢复(继续)就实现了。

 

 

 

 

分享到:
评论

相关推荐

    linux静态库和动态库

    与静态库相反,**动态库**在程序运行时才被链接到可执行文件中。这种方式的主要优点包括: - **节省内存**:多个程序可以共享同一个动态库,避免了不必要的内存占用。 - **便于更新**:动态库可以独立于应用程序...

    二年级数学下册 教学教案 静态资源动态利用 新人教版 素材.doc

    这种从静态到动态的转变,不仅使学生通过动手操作来更直观地理解重量单位间的转换,还通过视觉和触觉等多种感官的参与,加深了对概念的理解。 三、课堂互动的重要性 课堂不仅是知识的传授地,更是学生交流互动的...

    linux 动态库静态库

    静态库在编译时会被链接到目标程序中,形成一个完整的可执行文件,不依赖于系统中的动态库。静态库文件通常以`.a`为扩展名。创建静态库的流程与动态库类似,但不需要最后一步生成动态库。使用静态库的程序在运行时...

    实验静态路由和动态路由_路由_静态路由和动态路由_

    在实验过程中,可能会观察到以下现象:静态路由一旦设置好,除非手动更改,否则不会发生变化;而动态路由会根据网络状况持续调整,即使网络中新增或移除设备,路由信息也会自动更新。此外,还会对比两种路由方式在...

    cmakelists 生成静态库,然后用静态库生成动态库,然后生成测试程序

    本篇将深入探讨如何使用CMakeLists来生成静态库、动态库,并创建测试程序进行验证。 首先,我们要理解静态库和动态库的区别。静态库(.a 或 .lib)是在编译时将库代码直接嵌入到目标程序中,形成一个完整的可执行...

    动态Jsp页面转换成静态Html页面

    动态Jsp页面转换成静态Html页面动态Jsp页面转换成静态Html页面动态Jsp页面转换成静态Html页面动态Jsp页面转换成静态Html页面动态Jsp页面转换成静态Html页面动态Jsp页面转换成静态Html页面动态Jsp页面转换成静态Html...

    网站,静态与动态的区别

    假设有一个简单的在线商店,我们可以从以下几个方面来看其作为静态网站和动态网站的区别: - **静态网站**:如果这个商店是一个静态网站,那么它的商品信息将被提前编写成HTML文件并存储在服务器上。每当有新的商品...

    静态路由和动态路由同时存在,怎么配置

    静态路由和动态路由同时存在,怎么使用动态路由和静态路由同时在一个路由上配置。

    路由器动态和静态配置实验报告

    静态配置要求网络管理员为每个网络接口手动设定IP地址、子网掩码和默认网关等参数,而动态配置则是利用各种路由协议自动获取网络信息,动态地进行IP地址的分配和路由的更新。本文将通过图解和详细说明,对路由器的...

    webservice的动态调用和静态调用

    在开发中,我们通常会遇到两种调用方式:动态调用和静态调用。这两种方法各有特点,适用于不同的场景。 静态调用是通过在项目中添加Web引用或者服务引用来实现的。这种调用方式在编译时就已经确定了服务接口,因此...

    动态生成静态HTML

    - 存储和部署:生成的静态HTML文件需要保存到服务器的某个目录,并配置Web服务器以正确服务这些文件。 5. **实际应用** - 新闻系统:发布新闻时,动态生成对应的静态HTML页面,方便用户快速访问和搜索引擎收录。 ...

    LabVIEW静态和动态调用子VI经典示例

    本教程主要探讨的是如何在LabVIEW中静态和动态地调用子VI,以及这两种方法的不同特性。 一、静态调用子VI 静态调用子VI是在编译时确定的,即在设计阶段就固定了将要调用的子VI。这种方式的优点在于能够进行早期...

    动态 和 静态路 由 动态 静态 路由

    路由主要分为两种基本类型:静态路由和动态路由。 静态路由是由网络管理员手动配置的固定路由表,不随网络环境变化而自动更新。这种路由策略适用于网络规模较小、拓扑结构简单的环境,因为它们简单、高效且稳定。...

    qt5.12.0静态资源包/Visual Studio 2022 静态编译qt项目/静态与动态编译

    qt5.12.0静态资源包,不支持directx 12版本.因为大部分window7版本以下会无法打开qt应用. 使用方法为: 1.打开最新版visualStudio。创建新工程不打开项目,...动态编译要手东windeoloy ,体积几百M,静态编译只需要10M不到

    静态库和动态库里的全局变量(或类的静态成员变量)共享和独立的问题

    测试代码说明以下两个问题:...即:在A是动态库的这种情况下,B和C访问到的X是同一变量。 博文地址:http://blog.csdn.net/guggy/article/details/8136325 或即时记:http://www.livelog.cn/bbs/viewthread.php?tid=16

    静态路由和动态路由协议

    在计算机网络中,路由是决定数据包如何从源主机传输到目标主机的关键过程。静态路由和动态路由协议是两种常见的路由选择方式。 静态路由是指网络管理员手动在路由器中设定的固定路由表。这些路由条目不会自动更新,...

    Qt下使用C++调用静态库及动态库示例程序

    使用简单的程序展示了C++调用动态库和静态库的方法。 文件结构: exe:笔者部署可运行文件,因开发环境版本不同,可能存在无法直接使用的情况,两个部署文件(copy_ldd.sh及useLib1.sh)可以结合文章分享的(ubuntu下...

    静态网页和动态网页的区别.txt

    静态网页和动态网页的区别 动态网页和静态网页的区别,首先要分别了解两个概念,就是什么是静态网页,什么是动态网页,并且学会区分哪些是静态哪些是动态。 静态网页: (1)静态网页不能简单地理解成静止不动的...

    手工聚合、静态lacp、动态lacp差异.docx

    ### 手工聚合、静态LACP、动态LACP差异 #### LACP协议简介 LACP(Link Aggregation Control Protocol,链路汇聚控制协议)是一种基于IEEE 802.3ad标准的协议,用于实现链路动态汇聚与解汇聚。LACP通过LACPDU(Link ...

Global site tag (gtag.js) - Google Analytics