您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 操作系统课设Windows多线程控制台程序
沈阳理工大学课程设计专用纸1目录一、课程设计目的及要求................................1二、相关知识.........................................1三、题目分析.........................................2四、概要设计.........................................2五、代码及流程.......................................3六、运行结果.........................................7七、设计心得.........................................8七、参考文献.........................................8沈阳理工大学课程设计专用纸1一、课程设计目的及要求Windows多线程控制台程序目的:学习和掌握如何编写Windows多线程控制台程序。通过编写程序,加深对进程和线程关系的理解,掌握多线程程序的执行和编写技巧。内容要求:写一个单进程多线程的Windows控制台程序,该程序在一个进程内建立N个线程来执行指定的任务。N由命令行传递给系统二、相关知识1.控制台的概念?控制台是一个用来提供字符模式I/O的接口。这种处理器独立的机制使导入一个存在的字符模式程序或创建一个新的字符模式工具和程序变的容易。2.Windows下进程的创建Windows的进程和线程模型被描述成”多进程,基于单进程的多线程”。在创建一个线程时,Windows会做大量的工作---创建一个新的地址空间,为进程分配资源以及创建一个基线程。CreateThread的函数原型如下:HANDLECreateThread(LPSECURITY_ATTRIBUTESlpThreadAttributes,//SDDWORDdwStackSize,//initialstacksizeLPTHREAD_START_ROUTINElpStartAddress,//threadfunctionLPVOIDlpParameter,//threadargumentDWORDdwCreationFlags,//creationoptionLPDWORDlpThreadId//threadidentifier);3.实验准备:要实验的Windows下的多线程实验,应做如下准备:a)在新建中选”Win32ConsoleApplication”的Anemptyprojectb)选”工程”的”设置”选项,在”设置”中选择“C/C++”标签,在”ProjectOption”中,将”MLd”参数改成“MTd”(如图1)。沈阳理工大学课程设计专用纸2图1选项以上两步对实验成功至关重要,否则,即是代码无误,在连接时同样会出现问题。三、题目分析Windows多线程控制台程序,可以利用voidmain(intargc,char*argv[]),获取命令行参数,利用获取的参数,建立相应数量的线程。线程的建立可以用WindowsAPI提供的库函数CreateThread()创建所需要的线程。CreateThread()有六个参数,其中lpStartAddress是线程执行操作的函数的路口地址,lpParameter可以接受新创建的线程的参数,其余看参数使用默认的。在创建一个进程的同时系统会创建一个主线程,通过命令行获取的参数用户自定义创建子线程的个数,利用Sleep()函数,让主线程放弃处理机的使用权,转而由已经准备就绪的子线程去执行。将需要完成的任务函数,函数名作为路口地址作为子线程的第三个参数。四、概要设计本程序的设计思想是,创建N个线程,并指定所有创建的线程总共的执行时间,在这个时间内去完成指定的任务,如果无法完成输出相应的提示信息,完成也输入相应的提示信息。实现计时需要或得系统的当前时间利用GetSystemTime()获得,由系统的当前时间加上指定的执行时间即可得到任务执行的终止时间。全局变量staticintrunFlag=TRUE作为状态沈阳理工大学课程设计专用纸3标记,到达终止时间,置runFlag=FALSE,这样就可以终止线程的执行。设计的任务的是用N个线程在指定的时间里完成一个猜数游戏所有的数的生成都是随机的,所有的线程都参与,每个线程生成的随机数都和已经猜过的数比较,已经猜过的数放在放在全局数组里,利用这个全局数组实现了N个线程间的通信,如果生成的数不在数组里则与猜的数进行比较。五、代码及流程1.流程图图2程序流程图STARTparseArgToInt()GetSystemTime()for(i=0;ithreadNum;i++)while(runFlag)printf()ENDCreateThread()while()10*equipData+(inNumChar[i]-48)Sleep()ithreadNumithreadNumrunFlag=TURErunFlag=FALSEinti,flag;runFlag判断,猜数等一系列操作YreturnN沈阳理工大学课程设计专用纸42.主要代码#includewindows.h#includemath.h#includestdio.h#includestdlib.h#includetime.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(pleaseenterNThreadThreadNumrunTime\n);return;}srand((unsignedint)time(NULL));p=rand()/327;final=(int)eRandom(p);沈阳理工大学课程设计专用纸5printf(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;ithreadNum;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);沈阳理工大学课程设计专用纸6for(intj=0;j=r;j++){if(t==a[j]){flag=0;}}if(flag){if(t==final){printf(\n\nSuccessfully!ThethreadNo.%diswinnerandtheresuleis%d\n\n,tNo,final);exit(0);}else{a[r]=t;printf(Unfortune!ThethreadNo.%dansweriserroritsguess%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;沈阳理工大学课程设计专用纸7}while(tmpDataupLimit);returntmpData;}六、运行结果运行结果截图:1.在指定的时间内出现获胜者图3结果图12.在制定的时间内没有出现获胜者图4结果图2沈阳理工大学课程设计专用纸8七、设计心得通过这次的课程设计是我对操作系统有了更进一步的了解,当时拿到题目的时候连最基本的概念都不知道,比如什么是控制台程序?如何实现多线程?线程如何进行通信?很多都是上网查询所得,还有就是图书馆里的资料。每次课的课设日志对我的帮助很大,一是起到了督促作用,二是每次记录自己的所得和问题,循序渐进逐步完成课程设计。操作系统作为底层的系统软件,在实际应用中必不可少,有它构成计算机的基石,所以有理由要将这门课学好。了解操作系统工作机制,调度方法,以及基本原则。八、参考文献[1]刘振安、刘燕君著.《C++程序设计课程设计》.北京:机械工业出版社,2004[2][美]AbrahamSilberschatz,PeterBaerGalvin,GregGagne著.郑扣根译.操作系统概念(第六版).北京:高等教育出版社,2004[3]陈向群,向勇等.Windows操作系统原理(第二版).北京:机械工业出版社,2004.
本文标题:操作系统课设Windows多线程控制台程序
链接地址:https://www.777doc.com/doc-3365003 .html