白菜粉条汤
make life remembered
  • 首页
  • 分类
    • 随语
    • 杂志
    • 外贸
    • 技术
    • 图片
    • 电影
    • 音乐
    • 饮食
    • 大学
  • 关于
类别:

大学

大学

手机应用程序编写教程

by 曾经沧海 2006年5月27日

█前言 

  本文内容的所有操作皆在Windows 200操作系统上经过测试。如果您在不同的平台上验证本文内容,例如Windows 98或是Windows Me,则我们无法保证会有相同的结果。 

█简介 

  不知从什幺时候开始,我们突然感觉到周围的人各各拥有一只手机。利用手机与别人沟通成了我们生活的一部份。北欧某些先进国家的人民可以利用手机购买自动售货机所出售的商品;他们也可以在从事行动商务(m-commence) 交易时利用手机做为一种认证工具。在日本,行动电话的许多附加功能更是年轻人文化的一部分。即将来临的3G,无线宽频的美梦带给了人们对无线通讯未来的期待。 

  然后,有些厂商开始行销它们自己生产的PDA,好象没有一台PDA在手,就不像现代人似的。各式各样的PDA充斥市面,畅销的与不畅销的,让人眼花撩乱。这时产生了一个大问题–要我们同时携带手机和PDA是一件很麻烦的事情-就算它们都还算轻薄短小。如果可以把手机和PDA合而为一岂不是更方便吗? 于是听到消费者心声的厂商,开始有推出手机和PDA合而为一的产品,从NOKIA 9000、Motorola A6188(太极),到最近要推出的Ericsson R380、NOKIA 9210,都是手机与PDA结合的例子,虽然因为售价的关系,但是这些产品仍然是许多人梦寐以求的高阶产品。 

  尽管有了PDA与手机结合的产品出现,我们仍然觉得有所不足,我想大家一定发现了,就是应用程序的不足,虽然手机和PDA 结合了,可是这些产品上的PDA功能看起来似乎是死的。我们可以任意在PalmOS、Windows CE、EPOC等PDA上使用C/C++或是Java编写这些平台上的应用程序,但是却从未有过机会将我们写好的程序下载到这些手机上执行(即使有些手机的PDA也是使用EPOC,如Ericsson R380)。 

  相信厂商也听到我们这些喜欢到处写程序的工程师的心声了,所以从2000年年底开始,即将陆陆续续有许多支持Java的手机即将推出,当然,这些厂商也提供了在手机上开发程序的SDK,我们终于可以在手机上面写些小程序自娱了!这是以前等了很久的美梦。 

  手机平台的多样性与复杂性,和PDA比较起来可以说是有过之而无不及,于是大家就可以知道 – 哈!又是Java派上用场的时候了。我们都知道在浏览器上执行的Java程序叫做Applet,在PalmOS上执行的Java程序叫做Spotlet,然而在手机上执行的应用程序我们称做MIDlet,相信对大家来说都是一个陌生的名词,这也就是本篇文章所要介绍的主角。 

  支持Java的手机大厂目前已知有NOKIA (预计在2001年年初推出一款支持Java的手机NOKIA 9210)、Motorola(会先在支持integrated Digital enhanced network(iDen)网络的手机上支持Java,然后再推出支持Java的GSM手机,该公司的手机大致会在2002年前全部支持Java)以及NTT DoCoMo(将在明年第二季度左右推出支持Java的手机)。 

  虽然这些大公司都准备支持Java,不过在决定编写本文时,只有Motorola将其SDK开放于网站上供程序开发者下载测试,所以本文内容都是根据Motorola J2ME SDK所编写。又由于这些手机市面上无法取得,所以我们的程序都是在SDK内附的模拟器中执行,相信最后这些手机上市时,我们所编写的MIDlet应该会很容易并成功地在Motorola的手机上执行才对。

█如何取得Motorola J2ME SDK 

  我们要做的第一件事情当然还是要先取得SDK罗!
请直接到https://commerce.motorola.com/idenonline/ideveloper/下载Motorola J2ME SDK Drop 7。如果您不是iDEN® Developer的会员,请先在网络上注册(免费)。注册成功之后,Motorola会将密码寄到您的email信箱之中,然后使用该密码登入网页上的My Development Center。进入之后选择网页上头的TOOLS & RESOURCES以进入可下载的开发工具的网页,请选择Motorola J2ME SDK Components Developer Edition, Drop 7.0下方的下载超连结以下载SDK,整个SDK的大小约为3 MB左右。 

  请注意下载前的Download Page for Motorola J2ME™ SDK安装说明,里头会告诉你安装密码,请先行记下。稍后当您在您的电脑上安装Motorola J2ME SDK的时候,会询问您安装密码,所以请务必记下该密码。

█Motorola J2ME SDK的安装 

安装需求
根据官方需求,安装Motorola J2ME SDK的基本配备为:
  Pentium 100 MHz微处理器
  64 MB RAM
  Windows NT WorkStation 4.0配合Service Pack 3 / Win98
  (本文是在Windows 2000 Professional中文版上测试)
  约6 MB的硬盘空间
  Java 2 SDK 1.2.2
  (本文使用Java 2 SDK 1.3.0_01作测试) 

安装Motorola J2ME SDK
  要安装新版Motorola J2ME SDK之前,请先确认您已经将旧版的Motorola J2ME SDK完全删除。您可以由控制台里头的 「新增/删除程序」的功能删除旧版Motorola J2ME SDK。之后再将旧版Motorola J2ME SDK安装所在路径清除即可。
  解开您从Motorola网站上下载的ZIP文件,您会看到一个名为Motorola_SDK.exe的文件,双击此文件即可开始安装动作。请注意,在安装时系统会要求您输入密码,请输入之前所纪录的安装密码即可。 

█Motorola J2ME SDK目录结构

  当您成功地安装Motorola J2ME SDK之后,其目录结构如下图:

█MIDlet程序结构

  在手机上执行的程序我们统称MIDlet,其程序结构很简单,与大家熟悉的Applet结构有异曲同工之妙。
  每一个MIDlet程序都必须继承自javax.microedition.midlet.MIDlet类别,并实做三个函式,它们分别是:

protected void startApp()
protected void pauseApp()
protected void destroyApp(Boolean unconditional)
而一个MIDlet程序的起始与结束之流程我们以下图来表示:

█编写并编译MIDlet

  请先到您的Motorola J2ME SDK安装目录下的demo\midlets目录底下新建一个名为HelloMIDlet.java的文件,其内容为:

HelloMIDlet.java
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;

public class HelloMIDlet extends MIDlet 
{
  HelloMIDlet() 
  { 
  }

  protected void startApp() throws MIDletStateChangeException 
  {
  }

  protected void pauseApp() 
  {
  }

  protected void destroyApp(boolean unconditional)
  throws MIDletStateChangeException 
  {
  }
}
  在demo\midlets目录之中您会看到一个名为compileAll.bat的批处理文件,前面有提到,这个批处理文件除了可以帮助您编译所有内附范例程序之外,还可以简化您自己所编写的MIDlet之编译流程。
请在命令列视窗输入: compileAll HelloMIDlet.java
如果成功编译,屏幕上输出的结果如下图所示:

  从屏幕上的输出,您可以发现,要让MIDlet可以在手机上执行,大体上还是要经过两个动作(与Spotlet相似),分别是编译(compiling)以及预先审核(Preverifying)。
有关预先审核这个动作,笔者已经在RUN!PC 11月号的文章「利用Java 编写PalmOS应用程序基础篇」之中有向读者们提过,如果对这个方面有所疑问的朋友,请再将您的RUN!PC 11月号翻出来复习一下吧!

  从这个简短的MIDlet制作流程里头,相信大家可以发现,比起纯粹用Sun的CLDC编写能在KVM上执行的Spotlet要简单上许多。原因是compileAll.bat这个批处理文件帮我们做掉大部分dirty work。
  那幺,如果您写好的程序并非放在demo\midlets目录之中,是否就无法编译了? 从compileAll.bat里头,我们可以发现它帮我们完成上述两项工作的指令。如果我们写好的程序放在demo\midlets目录以外的地方,您可以执行下面的指令,您仍然可以成功地制作MIDlet:
  (我们假设您的Motorola J2ME SDK安装在D:\MotoSDK目录之中,并将您自行编写的HelloMIDlet.java置于d:\jdk1.3.0_01\my目录之中。同时我们假设您在d:\jdk1.3.0_01\my目录底下执行下面指令。)
编译: 

javac -O -bootclasspath d:\MotoSDK\lib HelloMIDlet.java 
注意: -bootclasspath指向类函数库的所在位置。 

预先审核: 

d:\MotoSDK\bin\preverifier -classpath d:\MotoSDK\lib;. -d . HelloMIDlet 
注意:
1 . -classpath指向类函数库的所在位置,也要指向我们所编写的MIDlet所在的位置。
2 .–d指向您希望预先编译类文件产生之后所放置的路径,如果写"."表示本目录,会覆盖掉原先未经过预先编译的类文件。如果您没有指定,则预设值为".\output"目录。 

  当然,如果您嫌自己手动操作很麻烦,您可以将compileAll.bat复制到其它目录之中,并更改其编译指令与预先审核指令之中和类函数库有关的相关设定即可。
  提到compileAll.bat,顺便向各位读者说明一下,在前面有提到,compileAll.bat可以帮助您编译所有位于demo\midlets目录下的范例程序,您只要在命列列下直接输入: compileAll即可。compileAll.bat会自动当您编译的package有以下几项:
  com.mot.j2me.midlets.bounce
  com.mot.j2me.midlets.imagetests
  com.mot.j2me.midlets.paddleball
  com.mot.j2me.midlets.scribble
  com.mot.j2me.midlets.tests
  com.mot.j2me.midlets.tutorials
  如果您希望compileAll.bat自动帮您编译其它package底下的程序,请您开启compileAll.bat,修改其COMPILECLASS环境变数的设定即可。

█修改并执行MIDlet 

  写好程序之后,大家最希望的事情当然就是让它在手机上执行,不过由于目前大家无法取得Motorola这些支持Java的手机,所以我们只能在Motorola J2ME SDK内附的模拟器上执行我们写好的MIDlet。相信手机正式推出时,应该可以顺利地在手机上执行。底下笔者将告诉您如何使用Motorola J2ME SDK内附的模拟器来测试您所编写的MIDlet。
  在这之前,由于之前我们所编写的范例程序只是简单的MIDlet空壳,我们必须让它能够在模拟器上显示出一些信息才可以,因此请修改上一个程序范例,使它的内容如下:
HelloMIDlet.java
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;

public class HelloMIDlet extends MIDlet 
{
private Display firstDisplay ;
private Form firstForm ;
HelloMIDlet() 
{
  firstDisplay = Display.getDisplay(this) ;
  firstForm = new Form("Hello MIDlet") ;
  StringItem firstStrItem = new StringItem("Hello","MIDlet") ;
  firstForm.append(firstStrItem) ;
}

protected void startApp() throws MIDletStateChangeException 
{
  firstDisplay.setCurrent(firstForm) ;
}

protected void pauseApp() 
{
}

protected void destroyApp(boolean unconditional)
    throws MIDletStateChangeException 
    { 
    }
}
  请将此文件放置在\demo\midlets目录下。编译完成之后,请将目录切换到scripts子目录之中,您会在此目录里发现一些写好的批处理文件。请在该目录下执行这些批处理文件指令以启动模拟器。执行的指令与执行结果如下所示:

指令: runEmul HelloMIDlet
输出结果

指令: runMotoi1000 HelloMIDlet
输出结果

指令: runMotoiDEN HelloMIDlet
输出结果 

指令: runStarTac HelloMIDlet
输出结果

指令: runMyDevice HelloMIDlet
输出结果
Error loading property file: C:/properties/mydevice.props (系统找不到指定的路径。)会出现错误信息是因为您没有指定属于是用者自订的手机外观的缘故,后面将会教您如何设定用户自订的手机外观。

  如果我们将写好的程序放在demo\midlets目录以外的地方,您可以执行下面的指令,仍然可以成功地启动模拟器并执行MIDlet:
  (我们假设您的Motorola J2ME SDK安装在D:\MotoSDK目录之中,并将您自行编写的HelloMIDlet.java置于d:\jdk1.3.0_01\my目录之中。同时我们假设您在d:\jdk1.3.0_01\my目录底下执行下面指令。)

执行一般模拟器 java -Djava.library.path=d:\MotoSDK\lib 
-classpath d:\MotoSDK\bin\Emulator.jar;d:\MotoSDK\bin\ConfigTool.jar com.mot.tools.j2me.emulator.Emulator 

-classpath.;d:\MotoSDK\lib javax.microedition.midlet.AppManager HelloMIDlet 

-JSA 1 1 

请注意:
第一个-classpath设定,-classpath与路径名称之间有空格。
第二个-classpath设定,-classpath与路径名称之间没有空格。 

执行模拟器并套用i1000手机外观
java -Djava.library.path=d:\MotoSDK\lib 
-classpath d:\MotoSDK\bin\Emulator.jar;d:\MotoSDK\bin\ConfigTool.jar com.mot.tools.j2me.emulator.Emulator 

-classpath.;d:\MotoSDK\lib 
-deviceFile resources\Motorolai1000.props
javax.microedition.midlet.AppManager 

HelloMIDlet
-JSA 1 1 

请注意:
第一个-classpath设定,-classpath与路径名称之间有空格。
第二个-classpath设定,-classpath与路径名称之间没有空格。 

执行模拟器并套用iDEN手机外观 java -Djava.library.path=d:\MotoSDK\lib 
-classpath d:\MotoSDK\bin\Emulator.jar;d:\MotoSDK\bin\ConfigTool.jar com.mot.tools.j2me.emulator.Emulator 

-classpath.;d:\MotoSDK\lib 
-deviceFile resources\MotorolaiDENPlatform.props
javax.microedition.midlet.AppManager 

HelloMIDlet
-JSA 1 1 
请注意:
第一个-classpath设定,-classpath与路径名称之间有空格。
第二个-classpath设定,-classpath与路径名称之间没有空格。 

执行模拟器并套用StarTac手机外观 java -Djava.library.path=d:\MotoSDK\lib 
-classpath d:\MotoSDK\bin\Emu
lator.jar;d:\MotoSDK\bin\ConfigTool.jar com.mot.tools.j2me.emulator.Emulator 

-classpath.;d:\MotoSDK\lib 
-deviceFile resources\StarTac.props
javax.microedition.midlet.AppManager 

HelloMIDlet
-JSA 1 1 
请注意:
第一个-classpath设定,-classpath与路径名称之间有空格。
第二个-classpath设定,-classpath与路径名称之间没有空格。 

执行模拟器并套用用户自订手机外观 java -Djava.library.path=d:\MotoSDK\lib 
-classpath d:\MotoSDK\bin\Emulator.jar;d:\MotoSDK\bin\ConfigTool.jar com.mot.tools.j2me.emulator.Emulator 

-classpath.;d:\MotoSDK\lib 
-deviceFile <您的props文件所在的绝对路径>javax.microedition.midlet.AppManager 

HelloMIDlet
-JSA 1 1 
请注意:
第一个-classpath设定,-classpath与路径名称之间有空格。
第二个-classpath设定,-classpath与路径名称之间没有空格。
如果您将您的props文件放在d:\MotoSDK\bin的resources目录之下,则上述指令只要改成:-deviceFile resources\<您的props文件名> 

注意,当您您直接使用上述指令启动模拟器,如果出现底下错误信息:
Error loading property file: resources/defaultdevice.props (系统找不到指定的路径。)
这是因为您没有将d:\MotoSDK\bin目录下的resources子目录复制到d:\JDK1.3.0_01\my目录之下的缘故。

2006年5月27日 0 评论 948 阅读
大学

J2ME开发入门

by 曾经沧海 2006年5月27日

J2ME方面开发的资料,确实是少之又少,一般给新手推荐的都是王森先生的《PDA与手机开发入门》一书,然而该书其实并不适合新人阅读,该书的前几章花了很大篇幅来讲解命令行调试J2ME程序的方法和很多要点,其实这些东西,作为一个初级的J2ME开发者来说,完全没有必要学习和掌握,反而只会给自己平添很多负担。现在做J2ME开发,大多都有了IDE(集成开发环境),比如JB,Eclipse什么的,就算是用最简单的WTK,也不需要进行path的配置等操作,所以初学者完全可以跳过这些内容,直接上手。我的认为,做程序开发,重在实践经验,而不是理论研究,因此,新人完全可以直接从J2ME的程序流程入手,直接进入,而不需要去了解太多基本概念,比如什么是API,什么是MIDP,什么是JDK等等。这些东西我到现在也不是很清楚,但并不影响我进行开发,我是讲究实用主义的,因此,本文的基调就在于讲述一些实用的开发方法。另外首先要声明:本文中的一切开发调试都是在WTK环境下进行的,请读者注意。
一.学习J2ME需要的基础知识
J2ME本身是Java语言的一部分,因此,对Java语言有一定了解是必要的,而Java语言本身是面向对象编程的一种语言,因此,对类与对象的概念要有必要的了解,而这些内容在本文中就不进行介绍了。另外,本文行文中对API的介绍很简略,因此,读者应该自己多查阅API中的相关内容。
二.J2ME开发环境简介
J2ME的开发环境如前文所述,目前主要有JB,Eclipse,WTK三种方式,其中前面两者都是集成开发环境,在编程上比较方便,有智能联想等功能,而WTK相对只提供了手动编译和打包,并且没有Debug功能。但WTK不需要多余的配置,对各种模拟器可以说是即插即用,而且在WTK下的程序目录简洁明了,方便查询。这几种开发环境各有长短处,所以大家可以自己选择,不过对新手来说,还是建议采用WTK,因为刚接触J2ME开发,与其把时间花在配置上,还不如花在编程上。
三.J2ME程序流程
我的感觉,每门语言都有自己的固定格式,就跟写文章的几要素一样,总有开头,结尾等等。而了解一门语言的格式,是学习这门语言最先要掌握的内容。
如果把程序流程比做是一个管道工程的话,那么每门语言里都有一个管道的入口,在J2ME里,这个入口就是MIDlet类,这个类一般也称为J2ME的主类,每个程序,都有一个或多个固定的主类,在这里,我们只谈一般的情况,即只有一个MIDlet主类的情况,大家看API即可知道,MIDlet类有几个固定方法,startApp(),pauseApp(),destroyApp(),这些方法就像是管道工程(以下的讲述里,我都把编程比作是管道工程)中的几个关键阀门,一个J2ME程序启动后,便先经历MIDlet的构造方法,然后进入startApp()方法,当有特殊情况挂起的时候,便会进入pauseApp方法,当程序结束时,便经由destroyApp方法退出。一个J2ME程序可以没有其他类,但不能没有MIDlet类,只要有一个完整的主类,便是一个完整的J2ME程序。比如非常精典的"HelloWorld",便只有一个MIDlet。

我觉得,J2ME实际上是一个很标准的顺序流程语言,J2ME中没有真正的多线程,很多情况下,一个J2ME程序的运行,我们都可以对他的流程进行完全的跟踪。这在调试方面是非常方便的。

在这里还要解释一点,J2ME程序中,屏幕对象是一个比较重要的对象,你的所有操作,你所要表达的意思,都需要在屏幕上描绘出来,因此,对屏幕的操作也是最基本和最重要的一个操作,因此,J2ME程序的操作其实就是对Display和Display上的Displayable(包括Form,TextBox,List,Canvas等等)对象进行控制。也就是说,让程序在合适的时候,把需要的Displayable显示在屏幕上。使用的方法,即是Display.setCurrent()方法。

在屏幕对象的操作上,我要解释一下,J2ME默认的屏幕只有一个,即是当前屏幕,所有操作都是对当前屏幕进行操作,因此,当你在主类中将一个Canvas对象设置为当前屏幕后,则主类已经处于脱屏状态,脱屏状态下的对象无法进行直接操作。这一点需要注意。所有外界的操作均只能作用于当前屏幕上显示的Displayable对象,无论是Form,List,或者是Canvas。此时对脱屏类的操作只能通过静态方法或者是该类的一个实例来进行。

J2ME的游戏中最简单的一种游戏流程是这样,即一个主类和一个Canvas类,主类入口处定义一个Canvas对象,并且此Canvas对象继承一个Runnable接口,再定义一个基于此对象的线程,然后将此Canvas对象设为当前屏幕对象,并启动线程,即用线程的start()方法,启动线程后,Canvas里的run方法便开始运行,而run方法通常要用repaint()方法来刷屏,因此流程就是按paint()->run->paint()…..这样的过程往复,其中如果还有键盘输入,则keyPressed()等方法就穿插在中间。基本上J2ME的程序就是按这样的流程来走,因此在开发和调试中只要对这个流程进行必要的跟踪就可以了。 
四.J2ME中常用的类
J2ME中常用的类有MIDlet,Form,List,Canvas,String,Command,Graphics等等。
其中Graphics作为游戏开发中的核心类,自然需要熟练的掌握。
在Graphics中如下的重要方法需要掌握:
setColor(int 设置的颜色)
setFont(Font 设置的字体)
drawRect(int 起点坐标x,int 起点坐标y,int 宽,int 高)
fillRect(int 起点坐标x,int 起点坐标y,int 宽,int 高)
drawImage(Image 要画的图形对象,int 起点坐标x,int起点坐标y,int 基点类型)
drawLine(int 起点坐标x,int起点坐标y,int 终点坐标x,int 终点坐标y)
drawString(String 要写的字符串, int 起点坐标x,int起点坐标y,int 基点类型)
在这里要说明一下什么是基点类型,基点是标志你设置的起点坐标在整个要绘制的对象(不论是图像还是文字)中的位置,如左上,右下,正中间等等。
常用的值有0或20:左上,17:正中间,24:右上,36:左下,40:右下。

除此之外,还有几个重要方法
addCommand,removeCommand,这两个方法是对Command的添加和取消的操作,很常用。
而谈到Command,自然就要涉及到commandListener这个接口,按钮的监听需要通过这个接口来进行,也就是要重载接口中的commandAction()方法。不过在使用这个接口的时候,不要忘了对当前的对象设置setCommandListener(this)。
另外,对于String类,substring方法应该掌握
而对于Form这些高级控件,可用方法不多,看看API即可。
五.J2ME中的线程
J2ME中的线程是Thread类,而实现线程有两种方法,一种是继承Runnable接口,一种是Timer和TimerTask。而不管是哪种线程,其本质都是在运行其中的run方法。在这里要注意,Runnable接口的run方法和TimerTask的run方法又是不同的,因为他们的运行机制不同。Runnable接口是*线程的休眠或等待来实现线程的刷新,而TimerTask是按照事先给定的时间间隔来自动刷新。对Runnable接口,一旦run方法结束后,则线程就结束了,因此Runnable线程里的run方法要写成循环方式,一般是while(isRunning)的形式,要结束的时候把isRunning设为false,而TimerTask则不用,因为他是定时刷新。但这样也有个问题,就是如果TimerTask的run方法写得过长,执行时间超过了设置的线程间隔时间,就会出现线
程重叠的情况。线程重叠会造成诸如游戏速度突然加快等Bug。
在Runnable接口定义的线程里,有两种等待方法,一种是wait,一种是sleep,如果使用wait方法,则要注意在线程run方法里,用synchonized标志符将该线程设置为同步锁定状态,否则会出现java.lang.IllegalMonitorStateException异常,大致意思是线程当前请求的监视器对象不能响应,因为被别的线程占用了。

线程在J2ME里非常重要,一切动态效果(当然这是游戏的前提)都是通过线程来操作,因此,对线程的控制是值得研究的一个问题。如何优化代码,使线程能够在足够短的间隔时间内正常刷新,换言之,这就是大家讨论的FPS问题。程序优化做得好,则线程间隔时间可以足够短,使得FPS可以足够高,游戏的流畅度当然就越高。
六.J2ME开发中的好习惯
1.     多写注释,完备的注释不管是对你自己,还是对别人,都是很有好处的,在调试中也会起很大的帮助。
2.     在重要流程的各个环节设置一些监听点,其实很简单,就是用symstem.out.println()来输出一些标志符号就可以了,这样可以监听你的程序在运行的时候,走到哪一步。
3.     不要写太多的类,尽量整合资源,不用的变量或者方法,尽量去掉。
4.     熟练掌握各种常见的异常,不要太依赖于问别人和翻书,这些应该是一个合格的程序员应该熟练于心的东西。
5.     对不熟悉的类,应该多写小代码来实验其用法,别人讲的永远不如自己研究出来的结果牢*。

2006年5月27日 0 评论 874 阅读
大学

操作系统实验

by 曾经沧海 2006年5月25日

实验一:生产者消费者进程(delphi代码+程序)
实验报告:点击下载
源文件:   点击下载
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, ComCtrls, Buttons,StrUtils;

type
  TForm1 = class(TForm)
   GroupBox1: TGroupBox;
    GroupBox2: TGroupBox;
    GroupBox3: TGroupBox;
    ListBox1: TListBox;
    ListBox2: TListBox;
    ListBox3: TListBox;
    GroupBox4: TGroupBox;
    GroupBox5: TGroupBox;
    Button1: TButton;
    Edit1: TEdit;
    Label2: TLabel;
    memo1: TMemo;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    BitBtn3: TBitBtn;
    Label1: TLabel;
    memo2: TMemo;
    Label3: TLabel;
    procedure Button2Click(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
    procedure BitBtn3Click(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;
type
  MyArray=array[0..14] of string;
var
  Form1: TForm1;
  memo1: TMemo;
  memo2: TMemo;
  hcdl,zsdl,jxdl:MyArray;
  steps:integer=0;
  function sta(dl:MyArray):string;
  function searchPC(pc:string;dl:MyArray):integer;
  function dlval(dl:MyArray;pos:integer):string;
  procedure PC(var dl:MyArray;pos:integer);
  procedure ZS(var dl:MyArray;pos:integer);  
implementation

{$R *.dfm}

procedure TForm1.Button2Click(Sender: TObject);
begin
self.Close;
end;

procedure TForm1.FormActivate(Sender: TObject);
var
 i:integer;
begin
      listbox1.Items.Clear;
      listbox2.Items.Clear;
      listbox3.Items.Clear;
      memo1.Clear;
      memo2.Clear;
      edit1.Clear;
      bitbtn3.Enabled:=false;
      steps:=0;
 for i:=0 to 14 do
     begin
        hcdl[i]:='';
        zsdl[i]:='';
        jxdl[i]:='';
        listbox1.Items.Add('');
        listbox2.Items.Add('');
        listbox3.Items.Add('');
     end;
     
 
end;

procedure TForm1.Button1Click(Sender: TObject);
  var
  num,rnd,i:integer;

begin
    if  edit1.text='' then
    begin
      exit;
    end;
    num:=strtoint(edit1.text);
    if (num>15) or (num<=0)  then
      begin
      showMessage ('请输入1-15的数字!');
      edit1.Clear;
      edit1.SetFocus;
      end
    else
    begin
        for i:=0 to num-1 do
          begin
            Randomize;
            rnd:=random(8)+1;
            if (rnd>=1)and (rnd<=4)  then
            jxdl[i]:='P'+inttostr(rnd)
            else
            jxdl[i]:='C'+inttostr(rnd-4);
         end;
       listbox3.Items.Clear;
 for i:=low(jxdl) to num-1 do
     begin
         listbox3.Items.Add(jxdl[i]);
     end;
     steps:=steps+1;
     memo2.Lines.Add(inttostr(steps)+':随机生成了'+inttostr(num)+'个进程!');
   
     for i:=num to high(jxdl) do
     begin
        listbox3.Items.Add('');
       end;
    end;
    bitbtn3.Enabled:=true;
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
begin
self.Close;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
self.FormActivate(Sender);
end;

procedure TForm1.BitBtn3Click(Sender: TObject);
var
  zsdlsta,hcdlsta,jxdlsta:string;
  jxtop:string;
begin
zsdlsta:=sta(zsdl);//判断阻塞队列状态,空与非空
hcdlsta:=sta(hcdl);//判断缓冲池状态
jxdlsta:=sta(jxdl);//就绪队列状态
jxtop:=dlval(jxdl,0);//判断就绪队列第一个进程的类型
if zsdlsta<>'empty' then
    begin             //阻塞不为空 ,就从阻塞队列拿
     {steps:=steps+1;
     memo2.Lines.Add(inttostr(steps)+':阻塞队列不为空');
     }
        if   hcdlsta='empty' then //缓冲为空,需要生产者
              begin
               //     showmessage('在

2006年5月25日 0 评论 675 阅读
大学

硬件实验MAXPLUSII

by 曾经沧海 2006年5月25日

实验一:

点击下载

实验二:
点击下载

2006年5月25日 0 评论 737 阅读
大学

WEB程序设计教程课程设计和以前的实验

by 曾经沧海 2006年5月25日

WEB程序设计教程课程设计:
点击下载

/////////////////////////////////////////////
作业及实验一、二:
点击下载

最新的:
点击下载

2006年5月25日 0 评论 862 阅读
大学

C++实验

by cainiaobos 2006年5月23日

点击下载

2006年5月23日 0 评论 920 阅读
大学

数值分析0522

by 曾经沧海 2006年5月22日

数值分析0522实验报告:

点击下载

2006年5月22日 4 评论 915 阅读
大学

我的硬件实验(明)

by wgming15 2006年5月19日

实验还没做完!
点击下载

2006年5月19日 0 评论 807 阅读
大学

《硬件设计与调试》实验

by 曾经沧海 2006年5月19日

实验指导书

===========================
验一、3-8译码器的设计

library ieee; 
use ieee.std_logic_1164.all 
entity decoder38 is 
port(a: in std_logic_vector(2 down to 0)
en: in std_logic 
y: out std_logic_vector(7 down to 0);
end decoder38; 
architecture a of decoder38 is
signal sel: std_logic_vector(3 down to 0);
begin 
sel(0)<=en;
sel(1)<=a(0);
sel(2)<=a(1); 
sel(3)<=a(2); 
with sel select 
y<="00000001"when"0001", 
y<="00000010"when"0011", 
y<="00000100"when"0101", 
y<="00001000"when"0111", 
y<="00010000"when"1001", 
y<="00100000"when"1011", 
y<="01000000"when"1101", 
y<="10000000"when"1111", 
y<="11111111"when others; 
end a;
===============================================
综合实验
验一、3-8译码器的设计
1、了解MAX+
2、复习VHDL语言的基础知 
二
1、掌握组合逻
2、掌握组合逻辑电路的静态测试方法
3、初步掌握MAX+plusⅡ软件的基本操作
4、初步了解可编程器件的设计全过程。 
三
译码器是将
一个4位的BCD码转换成7个码输出,以便在7段显示器上显示这个十进制数。译码
器有N个二进制选择线,那么最多可译码转换成2N个数据。当一个译码器有N条输入线和M
条输出线时,则称为N×M的译码器。本实验要求实现3×8译码器。 
分别使用图
仿真验证自己设计的电路,最后做出实验报告。 
1、设计输入 
(1)图形编辑 
打开MAX+plus 
对
(2)文本编辑 

打开MAX+p
,保存文件,扩展名为.vhd。 
参考程序代码(decoder38.vhd) 
library ieee; 
use ieee.std_log 
entity decoder38 is 
port(a: in std_logi
en: in std_logic 
y: out std_logic_v
r38; 
architecture a of 
signal sel: std_logic_vect 
begin 
sel 
sel(1)<=a(0);
sel(2)<=a(1); 
sel(3)<=a(2); 
with sel select 
y<=“00000001”
y<=“00000010”when“0011”, 
y<=“00000100”when“0101”, 
y<=“00001000”when“0111”, 
y<=“00010000”when“1001”, 
y<=“00100000”when“1011”, 
y<=“01000000”when“1101”, 
y<=“10000000”when“1111”, 
y<=“11111111”when others; 
选Assign/D
,选File/Project/Save & Compile 菜单,编译设计文件。 
选Ma
es from SNF菜单将输入和输出端口调入,然后再编辑)。选Max+plus2/Simulator 菜单
进行行为仿真。 
观察仿
六 
写出设计思想及
能及定义,验证文档与调试结果,最后写出结论及心得体会。 

实验二、RS触发器的设计 
1、熟悉MAX+
2、复习VHDL语言的基础知
3、复习数字电路中RS触发器的工 
二
1、掌握时序逻
2、了解VHDL数据流描述和行为描述
3、进一步掌握MAX+plusⅡ软件的基本操作与
4、进一步了解可编程器件的设计全过程。 
三
RS触发器 
使用数据流
方法在MAX+plusⅡ中设计RS触发器,并通过波形仿真验证自己设计的电路,最后做
出实验报告。 
1、设计输入 
打开MAX
保存文件,扩展名为.vhd。 
参考程序代码如下(rsff1.vhd 
library ieee; 
use ieee.std_logi
use ieee.std_logic_arith.all; 
use ieee.std_logic_unsigned.all; 
entity rsff1 is 
port(s,r: 
q, not_q: out std_logic

; 
architecture a 
signal qn,not_qn: std_logi
begin 
qn 
not_qn <=s nor qn; 
q <=qn; 
not_q <= not_qn;
end a; 
library ieee; 
use ieee.std_logi
entity rsff is 
port(s,r:
q, qb: out std_logic);
ff; 
architecture a 
signal q1,qb1:std_logic;
begin 
proce 
begin 
if(s=’1 
q1<=’0’ ; 
qb1<=’1’ ; 
elseif(s=’0’and 
q1<=’1’ ; 
qb1<=’0’ ; 
else 
q1< 
qb1<=qb1; 
end if; 
end process; 
q<=q1; 
qb<=qb1;
end a; 
选Assign/D
,选File/Project/Save & Compile 菜单,编译设计文件。 
选Ma
es from SNF菜单将输入和输出端口调入,然后再编辑)。选Max+plus2/Simulator 菜单

进行行为仿真。 
观察仿
六 
写出设计思想及
能及定义,验证文档与调试结果,最后写出结论及心得体会。 
1、熟悉MAX+
2、复习VHDL语言的基础知
3、思考分频电路的工作原理。 
二
1、掌握分频电
2、进一步掌握VHDL描述方法。
3、进一步掌握MAX+plusⅡ软件的
4、进一步了解可编程器件的设计全过程。 
三
在实际应用
时钟频率,采用低频率时钟信号的设备如果使用高频率的时钟往往出现错误或者不稳定
的情况,如键盘扫描容易出错,数码管会闪烁等情况。所以常常需要用到分频电路。分频电
路包括一个时钟输入(Clkin),一个时钟输出(Clkout)。使用一个中间变量Counter信号,
Counter信号从0开始,每当第N个上升沿到来时,Counter信号变为0,同时时钟输出(Clkout)
翻转一次,以此达到分频目的。 
使用VHD
,最后做出实验报告。 
1、设计输入 
打开MAX
保存文件,扩展名为.vhd。 
参考程序代码如下(frediv.vh 
library ieee; 
use ieee.std_lo
entity frediv is 
port(clkin: i
clkout: out std_logic); 

ediv; 
architecture a 
constant n:integer:=3; 
signal counter:integer ran 
signal clk:std_logic; 
gin 
p 
begin 
if ri 
if counter=n then –每计到
counter<=0; 
clk<=not clk; 
else 
count 
end if; 
end if; 
end process; 
clkout<=clk; 
end a; 
选Assign/D
,选File/Project/Save & Compile 菜单,编译设计文件。 
选Ma
es from SNF菜单将输入和输出端口调入,然后再编辑)。选Max+plus2/Simulator 菜单
进行行为仿真。 
4、下载 
观察仿
六 
写出设计思想及
能及定义,验证文档与调试结果,最后写出结论及心得体会。 
1、熟悉MAX+
2、复习VHDL语言的基础知
3、思考可逆计数器的设
计思想和工 
二
1、掌握可逆计

2、进一步掌握VHDL描述方法。 
3、进一步掌握MAX+plusⅡ软件的
4、进一步了解可编程器件的设计全过程。 
三
计数器在实
号(dir),以及二进制输出向量(q)对输入时钟信号进行计数,当控制信号dir为0时,
计数器进行加计数,计数值不断增加,反之,当控制信号dir为1时,计数器进行减计数,
计数值不断减少。 
使用VHD
电路,最后做出实验报告。 
1、设计输入 
打开MAX
保存文件,扩展名为.vhd。 
参考程序代码如下(bi3cnt.vh 
library ieee; 
use ieee.std_log
use ieee.std_logic_arith.all; 
use ieee.std_logic_unsigned.all; 
entity bi3cnt is 
port(clk,dir
q : out std_logic_vec 
architecture a 
signal qn:std_logic_vect 
begin 
pro 
begin 
if clk 
if dir=’0’then 
qn<=qn+1; 
else 
qn<=qn- 
end if; 
end if; 
end process; 
q=qn; 
end a; 
2、

选Assign/D
,选File/Project/Save & Compile 菜单,编译设计文件。 
选Ma
es from SNF菜单将输入和输出端口调入,然后再编辑)。选Max+plus2/Simulator 菜单
进行行为仿真。 
4、下载 
观察仿
六 
写出设计思想及
能及定义,验证文档与调试结果,最后写出结论及心得体会。

2006年5月19日 0 评论 733 阅读
大学

就业指导调查表.xls

by 曾经沧海 2006年5月15日

[file=uploads/200605/15_165846_.xls]点击下载[/file]

[file=uploads/200605/16_191318_.xls]就业指导调查结果表[/file]

2006年5月15日 0 评论 647 阅读
加载更多

热门

  • 无线餐饮点菜系统–去年的毕业设计

    2008年9月21日 36 评论 7.6K 阅读
  • Magento设置Paypal支付步骤

    2011年5月29日 1 评论 3.8K 阅读
  • 垃圾

    2017年3月12日 0 评论 2.9K 阅读
  • 记录

    2007年10月6日 0 评论 2.7K 阅读
  • 办公室的两只猫

    2017年12月19日 0 评论 2.6K 阅读

最新

  • 清明回了襄樊了

    2026年4月7日 0 评论 134 阅读
  • 十一月初七

    2025年12月26日 0 评论 286 阅读
  • 无题

    2025年11月28日 0 评论 340 阅读
  • 喝酒

    2025年9月3日 0 评论 497 阅读
  • Zammad登录CSRF token verification failed错误

    2025年6月17日 0 评论 661 阅读

分类

  • 图片 (71)
  • 外贸 (6)
  • 大学 (103)
  • 技术 (76)
  • 杂志 (290)
  • 电影 (13)
  • 资源 (1)
  • 随语 (93)
  • 音乐 (96)
  • 饮食 (3)

归档

  • 2026 年 4 月 (1)
  • 2025 年 12 月 (1)
  • 2025 年 11 月 (1)
  • 2025 年 9 月 (1)
  • 2025 年 6 月 (3)
  • 2025 年 4 月 (1)
  • 2025 年 2 月 (2)
  • 2025 年 1 月 (1)
  • 2024 年 12 月 (2)
  • 2024 年 10 月 (1)
  • 2024 年 9 月 (1)
  • 2024 年 7 月 (1)
  • 2024 年 6 月 (2)
  • 2023 年 9 月 (1)
  • 2023 年 6 月 (1)
  • 2023 年 5 月 (3)
  • 2023 年 4 月 (4)
  • 2023 年 3 月 (3)
  • 2023 年 2 月 (3)
  • 2023 年 1 月 (27)
  • 2021 年 8 月 (2)
  • 2021 年 1 月 (1)
  • 2020 年 3 月 (1)
  • 2019 年 3 月 (1)
  • 2017 年 12 月 (2)
  • 2017 年 3 月 (2)
  • 2011 年 10 月 (3)
  • 2011 年 8 月 (1)
  • 2011 年 7 月 (1)
  • 2011 年 5 月 (1)
  • 2011 年 4 月 (1)
  • 2011 年 1 月 (2)
  • 2010 年 12 月 (1)
  • 2010 年 9 月 (2)
  • 2010 年 8 月 (5)
  • 2010 年 7 月 (1)
  • 2010 年 6 月 (1)
  • 2010 年 5 月 (2)
  • 2010 年 4 月 (3)
  • 2010 年 2 月 (4)
  • 2010 年 1 月 (9)
  • 2009 年 12 月 (3)
  • 2009 年 11 月 (3)
  • 2009 年 9 月 (11)
  • 2009 年 8 月 (6)
  • 2009 年 7 月 (1)
  • 2009 年 6 月 (2)
  • 2009 年 5 月 (7)
  • 2009 年 4 月 (13)
  • 2009 年 3 月 (14)
  • 2009 年 2 月 (2)
  • 2009 年 1 月 (12)
  • 2008 年 12 月 (19)
  • 2008 年 11 月 (1)
  • 2008 年 10 月 (9)
  • 2008 年 9 月 (12)
  • 2008 年 8 月 (5)
  • 2008 年 7 月 (7)
  • 2008 年 6 月 (13)
  • 2008 年 5 月 (4)
  • 2008 年 4 月 (10)
  • 2008 年 3 月 (7)
  • 2008 年 2 月 (7)
  • 2008 年 1 月 (11)
  • 2007 年 12 月 (4)
  • 2007 年 11 月 (8)
  • 2007 年 10 月 (30)
  • 2007 年 9 月 (25)
  • 2007 年 8 月 (29)
  • 2007 年 7 月 (32)
  • 2007 年 6 月 (2)
  • 2007 年 4 月 (1)
  • 2007 年 3 月 (2)
  • 2007 年 2 月 (5)
  • 2007 年 1 月 (7)
  • 2006 年 12 月 (11)
  • 2006 年 11 月 (24)
  • 2006 年 10 月 (13)
  • 2006 年 9 月 (16)
  • 2006 年 8 月 (21)
  • 2006 年 7 月 (18)
  • 2006 年 6 月 (9)
  • 2006 年 5 月 (27)
  • 2006 年 4 月 (44)
  • 2006 年 3 月 (21)
  • 2006 年 2 月 (9)
  • 2006 年 1 月 (6)
  • 2005 年 12 月 (12)
  • 2005 年 11 月 (17)
  • 2005 年 10 月 (44)
  • 2005 年 9 月 (12)

标签

Apple (1) disaster movie (1) engine friendly url (1) extension (1) fuck song (1) ja slide show (1) joomla (8) joomla extension (3) Linkin Park (1) Macbook (1) magento (2) python (3) sef (2) slideshow (1) transformer (1) virtuemart (3) What I've Done (1) 一生何求 (1) 专升本 (4) 刀马旦 (1) 变形金刚 (1) 周慧敏 (2) 学生处 (6) 广告歌 (1) 成龙 (1) 我的大学 (6) 我的大学编年史 (6) 无尽的爱 (1) 樊海军 (6) 物理学系 (6) 物理系 (4) 电子信息工程 (4) 痴心换情深 (1) 神话 (1) 红颜知己 (1) 肇庆 (4) 肇庆学院 (6) 蝴蝶效应 (1) 视频 (1) 计算机系 (4) 谭咏麟 (3) 软件测试 (4) 金喜善 (1) 陈百强 (1) 黎明 (2)
  • 首页
  • 分类
    • 随语
    • 杂志
    • 外贸
    • 技术
    • 图片
    • 电影
    • 音乐
    • 饮食
    • 大学
  • 关于

@2005-2023 - 白菜粉条汤

白菜粉条汤
  • 随语
  • 杂志
  • 资源
  • 外贸
  • 技术
  • 图片
  • 电影
  • 音乐
  • 饮食
  • 大学
登入

保持登录状态,直到我退出

忘记密码了吗?

找回密码

新密码将通过电子邮件发送给您。

收到新密码了吗? Login here