嵌入式linux课程设计QT设计图片浏览自动更新_第1页
嵌入式linux课程设计QT设计图片浏览自动更新_第2页
嵌入式linux课程设计QT设计图片浏览自动更新_第3页
嵌入式linux课程设计QT设计图片浏览自动更新_第4页
嵌入式linux课程设计QT设计图片浏览自动更新_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、. . . . 科技学院课程设计成果院(系):_电气与信息工程学院_班 级: 计科09-02 学生: 学号:设计地点(单位)_ _I315 _ _设计题目:_ 广告自动更新系统_ _ 完成日期: 2012 年 7 月 6 日指导教师评语: _ 成绩(五级记分制):_ 教师签名:_摘要随着社会的发展,嵌入式linux在电子行业的应用越来越广泛,学习嵌入式linux显得非常重要。这次课程设计的主要目的是在QT设计广告显示界面,显示图片。并且实现广告自动更新,下载Ftp服务器的图片后自动加载到QT设计的广告界面。广告界面设计至少包括两个按钮(用于切换图片),实现QT界面上的按钮功能。熟悉linux底

2、层编程。利用QT设计界面,缩短开发时间。关键字:嵌入式linux;基础题;广告自动更新;QT 目 录课程设计任务书- 5 -题目一基础题- 8 -1 设计容与要求- 8 -1.1 二小题- 8 -1.2三小题- 8 -1.3四小题- 9 -1.3五小题- 10 -1.4六小题- 12 -1.5七小题- 13 -1.6八小题- 15 -题目二广告自动更新系统- 17 -1设计容与要求- 17 -1.1 广告自动更新系统的基本要求- 17 -1.2 需实现的主要功能- 17 -2需求分析- 17 -2.1 QT设计- 17 -2.2服务器端和客户端的数据传输方式- 18 -2.3 服务器端功能设计

3、- 18 -2.4客户端功能设计- 19 -3总体设计- 20 -3.1 总体功能- 20 -4. 详细设计- 21 -4.1 功能分析和描述- 21 -4.2 客户端功能模块- 21 -4.3 服务器功能模块- 23 -5. 代码实现- 24 -5.1 客户端代码- 24 -6功能实现- 28 -6.1 图片功能的实现- 28 -6.2 在FTP服务器上添加添加图片- 28 -6.3 浏览器自动加载服务器上的图片- 29 -7总结- 30 -8致- 31 -9参考文献- 32 -课程设计任务书科技学院课程设计任务书设计题目:基础题目学生梁巧课程名称嵌入式linux应用与开发课程设计专业班级计

4、科2009-01(嵌入式应用),计科2009-02(嵌入式应用),计科转2011-01(嵌入式应用)地 点I315起止时间2012-6-25至2012-7-6设计容与要求1、 GCC编译器的使用,LINUX系统C程序设计编译、调试方法2、 编写程序将数组容倒置a=”123456789”。3、 利用指针将数据A的容复制到数据B。4、 创建两线程,通过打印输出各自线程号和打印次序,要求从打印结果看出两个线程是并发执行的。5、 创建两线程,A线程通过消息队列发消息,B线程收到后在屏幕打印输出,要求两线程个打印出线程号和消息容。6、 创建两线程,A线程循环打印数组a100,B线程循环将数组成员+1,要

5、求利用互斥锁,使每次输出a0=a99.7、 创建两线程,A线程每2秒打印一次字母A,B线程每秒打印一次字母B,要求利用同步信号量,使输出字母B总是在A之后,如“ABBABBABB”。8、通过Makefile,将project中的两个.c编译成.a,另一个.c调用.a的函数,要现静态库的生成和调用,运行结果正确。设计参数进度要求第一周之完成参考资料1、嵌入式Linux应用程序开发标准教程.人民邮电。华见嵌入式培训中心。2010.72、ZLG ARMMAGIC2410实验指导、资料。3、嵌入式linux程序设计案例与实验教程.俞辉著,机械工业。2009.3其它说明.本表应在每次实施前一周由负责教师

6、填写二份,学院审批后交学院教务办备案,一份由负责教师留用。.若填写容较多可另纸附后。3.一题多名学生共用的,在设计容、参数、要求等方面应有所区别。系主任: 指导教师:易军 奎 2012年 7月 6 日科技学院课程设计任务书设计题目:广告自动更新系统学生梁巧课程名称嵌入式linux应用与开发课程设计专业班级计科2009-01(嵌入式应用),计科2009-02(嵌入式应用),计科转2011-01(嵌入式应用)地 点I315起止时间2012-6-25至2012-7-6设计容与要求1、在QT设计广告显示界面,显示图片。2、广告自动更新:下载Ftp服务器的图片后自动加载到QT设计的广告界面。3、广告界面

7、设计至少包括两个按钮(用于切换图片),实现QT界面上的按钮功能。选作:显示flash广告设计参数进度要求做完基础题目之后开始做本题目。参考资料1、嵌入式Linux应用程序开发标准教程.人民邮电。华见嵌入式培训中心。2010.72、ZLG ARMMAGIC2410实验指导、资料。3、嵌入式linux程序设计案例与实验教程.俞辉著,机械工业。2009.3其它说明.本表应在每次实施前一周由负责教师填写二份,学院审批后交学院教务办备案,一份由负责教师留用。.若填写容较多可另纸附后。3.一题多名学生共用的,在设计容、参数、要求等方面应有所区别。系主任: 指导教师:易军 奎 2012年 7 月 6 日题目

8、一 基础题1 设计容与要求1.1 二小题(1) 编写程序将数组容倒置a=”123456789”。(2) 程序代码实现如下:char a="0123456789"char tmp;int i = 0,j = 0;for(i = 0,j = strlen(a)-1;i<=strlen(a)/2-1;i+,j-) tmp = ai; ai = aj; aj = tmp;for(i = 0;i<strlen(a);i+)printf("%c",ai);printf("n");(3)程序分析:1.定义数组2.数组容倒置3.输出倒置后

9、数组容1.2三小题(1)利用指针将数据A的容复制到数据B。(2)程序代码实现如下:char A = "abcd"char B ="1234"int i = 0;char *tmp;tmp = A;for(i = 0;i<strlen(A);i+)Bi = *tmp+;for(i = 0;i<strlen(A);i+)printf("%c",Bi);printf("n");(3)程序分析:1.定义数组2.定义指针3.指针指向数组A4.移动指针拷贝数字到B中5.显示拷贝后的数组1.3四小题(1)创建两线程,

10、通过打印输出各自线程号和打印次序,要求从打印结果看出两个线程是并发执行的。(2)程序代码如下:#define THREAD_NUMBER2#define REPEAT_NUMBER5#define DELAY_TIME_LEVELS10.0void * thrd_func(void *arg)int thrd_num = (int)arg;int delay_time = 0;int count = 0;printf("Thread %d is startingn", thrd_num);for (count = 0; count < REPEAT_NUMBER; c

11、ount+)delay_time = (int)(rand() * DELAY_TIME_LEVELS/(RAND_MAX) + 1;sleep(delay_time);printf("tThread %d: job %d delay = %dn", thrd_num, count, delay_time);printf("Thread %d finishedn", thrd_num);pthread_exit(NULL);int main(void)pthread_t threadTHREAD_NUMBER;int no = 0, res;void *

12、 thrd_ret;for (no = 0; no < THREAD_NUMBER; no+)res = pthread_create(&threadno, NULL, thrd_func, (void*)no);for (no = 0; no < THREAD_NUMBER; no+)res = pthread_join(threadno, &thrd_ret);return 0; (3)程序分析:程序中创建2个线程,为了更加方便地描述线程之间的并行执行,让2个线程重用一个执行函数。每个线程都有5次循环,每次循环之间会随机等待1-10s的时间,意义在于模拟每个任务

13、的到达时间是随机的,更加形象看出线程之间的并行执行。1.创建线程执行函数,程序中2个线程重用一个执行函数。2.让线程延时,延时时间随机产生。3.线程退出。4.创建2个线程。1.3五小题(1)创建两线程,A线程通过消息队列发消息,B线程收到后在屏幕打印输出,要求两线程个打印出线程号和消息容。(2)程序代码如下:#define BUFSZ512#define THREAD_NUMBER2struct messagelong msg_type;char msg_textBUFSZ;struct message msg;int qid;/*Create queue*/void * thrd_func0

14、(void *arg)int thrd_num = (int)arg; int len = 0;printf("Thread %d is startingn", thrd_num); sprintf(msg.msg_text,"%s","send the msg");msg.msg_type = getpid();len = strlen(msg.msg_text);/*添加消息到消息队列*/ msgsnd(qid, &msg, len, 0); printf("send the message is:%sn&quo

15、t;,(&msg)->msg_text);pthread_exit(NULL);void * thrd_func1(void *arg)int thrd_num = (int)arg;printf("Thread %d is startingn", thrd_num);/*读取消息队列*/msgrcv(qid, &msg, BUFSZ, getpid(), 0); printf("recv the message is:%sn",(&msg)->msg_text);pthread_exit(NULL);void *(*

16、const funcTHREAD_NUMBER)(void *)=thrd_func0,thrd_func1;int main(void)pthread_t threadTHREAD_NUMBER;int no = 0, res;void * thrd_ret;key_t key;int len; key = ftok(".", 'a'); qid = msgget(key,IPC_CREAT|0666); for (no = 0; no < THREAD_NUMBER; no+)res = pthread_create(&threadno,

17、NULL, funcno, (void*)no);for (no = 0; no < THREAD_NUMBER; no+)res = pthread_join(threadno, &thrd_ret); (msgctl(qid, IPC_RMID, NULL); return 0; 代码分析如下:该程序实现了使用消息队列进行线程之间的通信,包括消息队列的创建、消息发送和读取、消息队列的撤销和删除等操作。1.定义消息队列消息结构体2.创建线程0,用于消息队列发送消息3.添加消息到消息队列4.退出线程5.创建线程1,用于消息队列读取消息6.读取消息队列7.根据不同的路径和关键表示产

18、生标准的key8.创建消息队列9.等待线程10.从系统核中移走消息队列 1.4六小题(1)创建两线程,A线程循环打印数组a100,B线程循环将数组成员+1,要求利用互斥锁,使每次输出a0=a99.(2)程序源代码如下:#include<sys/types.h>#include<sys/ipc.h>#include<pthread.h>#include<semaphore.h>#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<stri

19、ng.h>sem_t sem;void *thrd_fun1(void *arg) int thrd_num=(int)arg; while(1) printf("An"); sem_post(&sem); sleep(2); pthread_exit(NULL);void *thrd_fun2(void *arg) int thrd_num=(int)arg; int i; while(1) sem_wait(&sem);printf("Bn"); sleep(1);printf("Bn"); sleep(1)

20、; pthread_exit(NULL);int main(void) pthread_t thread2; int no=0,res; void *thrd_ret; sem_init(&sem,0,0); res=pthread_create(&thread0,NULL,thrd_fun1,(void*)no); if(res!=0) printf("Create thread 1 failedn"); exit(res); res=pthread_create(&thread1,NULL,thrd_fun2,(void*)no); if(res

21、!=0) printf("Create thread 1 failedn"); exit(res); for(no=0;no<2;no+) res =pthread_join(threadno,&thrd_ret); if(!res) printf("Thread %d exitn",no); else printf("Thread %d exit failedn",no); return 0;(3)程序分析如下:1.定义消息队列消息结构体2.创建线程0,用于消息队列发送消息3.添加消息到消息队列4.A线程循环打印数组a

22、1005.B线程循环将数组成员+16.输出a0=a991.5七小题(1)创建两线程,A线程每2秒打印一次字母A,B线程每秒打印一次字母B,要求利用同步信号量,使输出字母B总是在A之后。 (2)程序代码如下:#define THREAD_NUMBER2sem_t semTHREAD_NUMBER;void * thrd_func0(void *arg) /Aarg = arg;while(1) printf("An"); sem_post(&sem1); sleep(2);pthread_exit(NULL);void * thrd_func1(void *arg)

23、/Barg = arg;while(1) sem_wait(&sem1); printf("Bn"); sleep(1);pthread_exit(NULL);void *(*const funcTHREAD_NUMBER)(void *)=thrd_func0,thrd_func1;int main(void)pthread_t threadTHREAD_NUMBER;int no = 0, res;void * thrd_ret;for (no = 0; no < THREAD_NUMBER; no+)res = pthread_create(&t

24、hreadno, NULL, funcno, (void*)no);printf("Create thread successn Waiting for threads to finish.n");for (no = 0; no < THREAD_NUMBER; no+)sem_destroy(&semno);return 0; (3)程序分析如下: 程序创建两线程,实现A线程每2秒打印一次字母A,B线程每秒打印一次字母B,利用同步信号量,使输出字母B总是在A之后。1.创建线程0执行函数,用于打印字符A2.打印字符A3.对信号量1进行V操作4.延时2s5.退出

25、线程6.创建线程1执行函数,用于打印字符B7.对信号量1进行P操作8.打印字符B9.延时1s10.创建线程1.6八小题 (1)通过Makefile将project中的一个.c编译成.a,另一个.c调用.a的函数,要现静态库的生成和调用,运行结果正确。 (2)编写静态库程序thread.c如下:#include <stdio.h>void pf1(void) printf("*n"); return;void pf2(void) printf("#n"); return;该程序定义两个函数,分别打印不同的容,该程序将被编译成.a静态库编写调用程

26、序call.c如下:extern void pf1(void);extern void pf2(void);int main(void) pf1(); pf2(); return 0;该程序对静态库进行调用,调用静态库中的两个函数pf1和pf2。编写Makefile如下:CC=gccCPPFLAGS=-cOBJS = thread.oSOURCE = thread.cCALL_SOURCE=call.cLIB = libthread.aEXEC=callAR=arthread: $OBJS$CC -c $SOURCE -o $OBJS $AR rcsv $(LIB) thread.o$CC -

27、o $EXEC $CALL_SOURCE -L. -lthread.PHONY : cleanclean :-rm -f $OBJS $EXEC $LIBMakefile文件实现对静态库程序编译成.a静态库,并且编译调用静态库的程序call.c为可执行文件call题目二 广告自动更新系统1设计容与要求1.1 广告自动更新系统的基本要求1、在QT设计广告显示界面,显示图片。2、广告自动更新:下载Ftp服务器的图片后自动加载到QT设计的广告界面。3、广告界面设计至少包括两个按钮(用于切换图片),实现QT界面上的按钮功能。1.2 需实现的主要功能(1) 在PC机上搭建FTP环境,建立FTP服务器。(

28、2) 服务器必须成功启动。(3) QT编写客户端与服务器建立连接。(4) 客户端和服务器可以实现通信。(5) 客户端可自动下载FTP服务器上的图片自动加载到浏览器上显示。(6) 利用QT设计界面,并下载到ARM板上面。2需求分析2.1 QT设计QT设计编写和调试阶段使用4.7.1编译器,运行测试阶段使用QT for ARM编译器。使用QT for PC阶段编译程序的步骤如下(以编译hello.cpp程序为例):(1)进入/x86-qtopia目录,运行set-env脚本,设置环境变量。$ . set-env(2)进入hello目录,然后用progen工具生成工程文件。$ cd

29、 hello$ vi hello.cpp$ progen t app.t o (3)使用tmake工具,生成hello工程的Makefile文件。$ tmake -o Makefile (4)修改Makefile文件,在LIBS变量中增加需要用到的库,然后输入make命令编译。LIBS = $(SUBLIBS) -L$(QTDIR)/lib -lqte -lm -lstdc+$ make(5)启动虚拟控制台,运行hello程序(主机须启动帧缓冲,必须能够访问/dev/fb0)。$ cd /zylinux/x86-qtopia$ . set-env$ cd h

30、ello$ ./hello qws如果要将Hello程序发布到ARM板上运行,还需进行以下工作:(6)进入/zylinux/arm-qtopia目录,并将hello工程复制到当前目录下。$ cd /zylinux/arm-qtopia$ cp av /zylinux/x86-qtopia/hello (7)运行当前目录下的set-env文件,重新设置环境变量,进入hello目录,使用tmake工具,重新生成Makefile文件。$ . set-env$ cd hello$ tmake -o Makefile (8)按照步骤(4)的方法修改包含库,编译,得到可执行文件hello

31、,将hello文件添加到文件系统中,更新文件系统。(9)插入USB鼠标和USB键盘,启动ARM板。启动Qtopia的终端,运行hello程序。利用同样的编译方法,客户端QT程序进行编译和调试。2.1.1客户端QT界面设计客户端QT需要以下基本组件:(1)一个向前按钮,一个向后按钮以与循环按钮。(2)制作一个图片浏览器,能够显示某个文件中的图片。(3)在图片浏览器中增加下载更新,文件列表更新。(4)添加客户端与服务器相连,实现下载和更新。2.2服务器端和客户端的数据传输方式服务器端和客户端的数据是用TCP套接字来传输的。IP地址表示Internet上的计算机,端口号标识正在计算机运行的进程。端口

32、号与IP地址的组合得出一个网络套接字。客户端使用linux C 函数socket建立到服务器的套接字连接。 当套接字连接socket建立后,可以利用linux C语言中的send函数和recv函数来实现简单的发送和接收消息。2.3 服务器端功能设计服务器没有用QT来编写界面,只是实现一个简单的控制程序。服务器主要实现有:(1)创建套接字(2)对套接字、IP地址和端口号进行绑定(3)进行监听(4)等待客户端的连接(5)对客户端自动进行连接并自动下载图片到客户端2.4客户端功能设计客户端使用QT设计界面,客户端实现的功能如下: (1)创建套接字 (2)连接服务器 (3)实现图片的浏览 (4)自动下

33、载服务器图片3总体设计3.1 总体功能根据对需求所做的分析,广告自动更新系统需要实现的基本功能应包括以下几个方面:(1) 在PC机上搭建FTP环境,建立FTP服务器。(2) 服务器必须成功启动。(3) QT编写客户端与服务器建立连接。(4) 客户端和服务器可以实现通信。(5) 客户端可自动下载FTP服务器上的图片自动加载到浏览器上显示。(6) 利用QT设计界面,并下载到ARM板上面。使用QT设计的界面简洁,大方,操作简单,方便,容易上手,用户可以快速掌握操作流程。开始界面图片浏览默认文件夹是否有文件不显示图片无显示文件夹图片有FTP服务器图片有更新自动下载FTP服务器的图片图3.1总体设计流程

34、图4. 详细设计4.1 功能分析和描述 广告自动更新包括两大功能模块:客户端和服务器端。具体实现的功能创建套接字、连接通信、客户端从服务器自动下载图片加载到图形界面4.2 客户端功能模块4.2.1连接服务器连接服务器之前需要解析服务器地址、创建套接字、设置sockaddr_in 结构体中相关参数。连接服务器设置相关参数创建套接字解析服务器地址图4.2.1 连接功能流程图4.2.2图片下载功能连接功能是下载服务器图片前必须进行的步骤,连接成功之后,就可以进行图片下载了。图片下载功能流程图如图2-5所示:是否连接成功无法下载图片否从服务器上下载图片是自动加载到图形界面 图4.2.2 图片下载功能流

35、程图4.3 服务器功能模块服务器的设计并没有使用QT编写界面,服务器端实现的功能有:创建套接字对套接字和IP地址进行验证等待客户端进行连接对客户端自动传送图片文件图4.3 服务器模块流程图5. 代码实现5.1 客户端代码5.1.1 QT图片浏览器功能函数的实现向前翻的实现:void ImageViewer:on_actionPrevious_triggered()if(currentFile = displayFiles.constBegin()currentFile = displayFiles.constEnd();currentFile-;DisplayImage(dirCurrent-

36、>absoluteFilePath(*currentFile);UpdateUI();向后翻的实现:void ImageViewer:on_actionNext_triggered()currentFile+;if(currentFile = displayFiles.constEnd()currentFile = displayFiles.constBegin();DisplayImage(dirCurrent->absoluteFilePath(*currentFile);UpdateUI();显示时间更新:void ImageViewer:displayTimerUpdate

37、() currentFile+; / currentFile指向下一图片 if(currentFile = displayFiles.constEnd()/边界检查 currentFile = displayFiles.constBegin(); /显示currentFile所指的图片 DisplayImage(dirCurrent->absoluteFilePath(*currentFile); UpdateUI(); /更新图片显示区域 automaticTimer->start(displaySpace * 1000);/重启定时器循环播放的实现:void ImageView

38、er:on_actionAutomaticPlay_triggered() if(displayLoop = false) /如果不是循环播放模式 displayLoop = true; /设置为循环播放模式 automaticTimer->start(displaySpace * 1000);/启动定时器 /设置actionAutomaticPlay控件的图标为pause.png actionAutomaticPlay->setIcon(QIcon(":/images/pause.png"); else displayLoop = false; automat

39、icTimer->stop();/停止定时器 /设置actionAutomaticPlay控件的图标为play.png actionAutomaticPlay->setIcon(QIcon(":/images/play.png"); 5.1.2 下载更新void ImageViewer:downloadUpdate() downloadTimer->stop(); if(fileList->topLevelItemCount() = advertisementCount) else QString fileName; /QMessageBox:information(this,tr("topLevelItemCount"),QString("%1").arg(fileList->topLevelItemCount(); for(int i = 0; i < fileList->topLevelItemCount(); i+) fileName = fileList->topLevelItem(i)->

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论