操作系统课设Windows多线程控制台程序_第1页
操作系统课设Windows多线程控制台程序_第2页
操作系统课设Windows多线程控制台程序_第3页
操作系统课设Windows多线程控制台程序_第4页
操作系统课设Windows多线程控制台程序_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

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

文档简介

目录一、课程设计目的及要求 1二、相关知识 1三、题目分析 2四、概要设计 2五、代码及流程 3六、运行结果 7七、设计心得 8七、参考文献 8一、课程设计目的及要求Windows多线程控制台程序目的:学习和掌握如何编写Windows多线程控制台程序。通过编写程序,加深对进程和线程关系的理解,掌握多线程程序的执行和编写技巧。内容要求:写一个单进程多线程的Windows控制台程序,该程序在一个进程内建立N个线程来执行指定的任务。N由命令行传递给系统二、相关知识1.控制台的概念?控制台是一个用来提供字符模式I/O的接口。这种处理器独立的机制使导入一个存在的字符模式程序或创立一个新的字符模式工具和程序变的容易。2.Windows下进程的创立 Windows的进程和线程模型被描述成”多进程,基于单进程的多线程”。

在创立一个线程时,Windows会做大量的工作创立一个新的地址空间,为进程分配资源以及创立一个基线程。CreateThread的函数原型如下: HANDLECreateThread( LPSECURITY_ATTRIBUTESlpThreadAttributes,//SD DWORDdwStackSize,//initialstacksize LPTHREAD_START_ROUTINElpStartAddress,//threadfunction LPVOIDlpParameter,//threadargument DWORDdwCreationFlags,//creationoption LPDWORDlpThreadId//threadidentifier );3.实验准备:要实验的Windows下的多线程实验,应做如下准备:

a)在新建中选”Win32ConsoleApplication”的Anemptyproject

b)选”工程”的”设置”选项,在”设置”中选择“C/C++”标签,在”ProjectOption”中,将”MLd”参数改成“MTd”(如图1)。图1选项以上两步对实验成功至关重要,否那么,即是代码无误,在连接时同样会出现问题。三、题目分析Windows多线程控制台程序,可以利用voidmain(intargc,char*argv[]),获取命令行参数,利用获取的参数,建立相应数量的线程。线程的建立可以用WindowsAPI提供的库函数CreateThread()创立所需要的线程。CreateThread()有六个参数,其中lpStartAddress是线程执行操作的函数的路口地址,lpParameter可以接受新创立的线程的参数,其余看参数使用默认的。在创立一个进程的同时系统会创立一个主线程,通过命令行获取的参数用户自定义创立子线程的个数,利用Sleep()函数,让主线程放弃处理机的使用权,转而由已经准备就绪的子线程去执行。将需要完成的任务函数,函数名作为路口地址作为子线程的第三个参数。四、概要设计本程序的设计思想是,创立N个线程,并指定所有创立的线程总共的执行时间,在这个时间内去完成指定的任务,如果无法完成输出相应的提示信息,完成也输入相应的提示信息。实现计时需要或得系统的当前时间利用GetSystemTime()获得,由系统的当前时间加上指定的执行时间即可得到任务执行的终止时间。全局变量staticintrunFlag=TRUE作为状态标记,到达终止时间,置runFlag=FALSE,这样就可以终止线程的执行。设计的任务的是用N个线程在指定的时间里完成一个猜数游戏所有的数的生成都是随机的,所有的线程都参与,每个线程生成的随机数都和已经猜过的数比拟,已经猜过的数放在放在全局数组里,利用这个全局数组实现了N个线程间的通信,如果生成的数不在数组里那么与猜的数进行比拟。五、代码及流程1.流程图STARTSTARTparseArgToIntparseArgToInt()while()while()GetSystemTimeGetSystemTime()CreateThread()CreateThread()10*equipData+(inNumChar[i]-48)for(i=0;i<threadNum;i++)10*equipData+(inNumChar[i]-48)for(i=0;i<threadNum;i++)i<threadNumi<threadNumi>threadNumi>threadNumwhile(runFlag)while(runFlag)runFlag=TURErunFlag=TURErunFlag=FALSErunFlag=FALSESSleep()inti,flag;inti,flag;printf()printf()runFlagrunFlagYENDYENDN判断,猜数等一系列操作N判断,猜数等一系列操作returnreturn图2程序流程图2.主要代码#include<windows.h>#include<math.h>#include<stdio.h>#include<stdlib.h>#include<time.h>#defineN5#defineTypefloatstaticintrunFlag=TRUE;staticintr=0;inta[1000];intfinal;DWORDWINAPIthreadWork(LPVOIDthreadNo);intparseArgToInt(char*inNumChar);TypeeRandom(intupLimit);typedefstruct{ intdata;}INTEGER;voidmain(intargc,char*argv[]) //主函数{ unsignedintrunTime; inti; intthreadNum; SYSTEMTIMEnow; WORDstopTimeMinute,stopTimeSecond; DWORDtargetThreadID; intp; if(argc!=3) { printf("pleaseenterNThread<ThreadNum><runTime>\n"); return; } srand((unsignedint)time(NULL)); p=rand()/327; final=(int)eRandom(p); printf("Thefinalis%d\n",final); threadNum=parseArgToInt(argv[1]); runTime=parseArgToInt(argv[2]); GetSystemTime(&now); printf("Startingatesystemtime%d,%d,%d\n",now.wHour,now.wMinute,now.wSecond); stopTimeSecond=(now.wSecond+(WORD)runTime)%60; stopTimeMinute=now.wMinute+(now.wSecond+(WORD)runTime)/60; INTEGER*tmpInt; for(i=0;i<threadNum;i++) { tmpInt=(INTEGER*)malloc(sizeof(INTEGER)); tmpInt->data=i; CreateThread(NULL,0,threadWork,tmpInt,0,&targetThreadID); Sleep(100); } while(runFlag) { GetSystemTime(&now); if((now.wMinute>=stopTimeMinute)&&(now.wSecond>=stopTimeSecond)) runFlag=FALSE; Sleep(1000); } printf("Timeoverandnotwinner!\n"); GetSystemTime(&now); printf("Endatesystemtime%d,%d,%d\n",now.wHour,now.wMinute,now.wSecond);}DWORDWINAPIthreadWork(LPVOIDthreadNo) //线程执行的函数{ inti,flag; intk,p,t; inttNo=((INTEGER*)threadNo)->data; intsleepTime; DWORDresult=0; srand((unsignedint)time(NULL)); while(runFlag) { flag=1; k=rand()/327; p=(int)eRandom(k); t=(int)eRandom(p); for(intj=0;j<=r;j++) { if(t==a[j]) { flag=0; } } if(flag) { if(t==final) {printf("\n\nSuccessfully!ThethreadNo.%d iswinnerandtheresuleis%d\n\n",tNo,final); exit(0); } else { a[r]=t; printf("Unfortune!Thethread No.%d answeriserroritsguess %d\n",tNo,t); r++; } } Sleep(1500); } returnresult;}intparseArgToInt(char*inNumChar) //命令行参数类型转换{ intequipData=0,i=0; while(inNumChar[i]>='0'&&inNumChar[i]<='9') { equipData=10*equipData+(inNumChar[i]-48); i++; } returnequipData;}TypeeRandom(intupLimit) //生成随机数{ TypetmpData; do{ tmpData=((Type)rand()/(Type)32767)*(Type)100.0*(Type)upLimit; }while(tmpData>upLimit); returntmpData;}六、运行结果运行结果截图:在指定的时间内出现获胜者图3结果图1在制定的时间内没有出现获胜者图4结果图2七、设计心得通过这次的课程设计是我对操作系统有了更进一步的了解,当时拿到题目的时候连最根本的概念都不知道,比方什么是控制台程序?如何实现多线程?线程如何进行通信?很多都是上网查询所得,还有就是图书馆里的资料。每次课的课设日志对我的帮助很大,一是起到了催促作用,二是每次记录自己的所得和问题,循序渐进逐步完成课程设计。操作系统作为

温馨提示

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

评论

0/150

提交评论