程序設(shè)計(jì)實(shí)踐6w-概要設(shè)計(jì)和模塊化_第1頁
程序設(shè)計(jì)實(shí)踐6w-概要設(shè)計(jì)和模塊化_第2頁
程序設(shè)計(jì)實(shí)踐6w-概要設(shè)計(jì)和模塊化_第3頁
程序設(shè)計(jì)實(shí)踐6w-概要設(shè)計(jì)和模塊化_第4頁
程序設(shè)計(jì)實(shí)踐6w-概要設(shè)計(jì)和模塊化_第5頁
已閱讀5頁,還剩48頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

程序設(shè)計(jì)實(shí)踐6w-概要設(shè)計(jì)和模塊化第一頁,共53頁。提綱1.軟件概要設(shè)計(jì)和模塊化2.使用線程實(shí)現(xiàn)任務(wù)并發(fā)3.時(shí)間控制函數(shù)2第二頁,共53頁。概要設(shè)計(jì)和模塊化復(fù)雜的軟件研發(fā)核心策略:分而治之、模塊化設(shè)計(jì)與實(shí)現(xiàn)模塊1模塊2模塊n3第三頁,共53頁。3.概要設(shè)計(jì)要點(diǎn)概要設(shè)計(jì)的目的:全局把握程序結(jié)構(gòu):進(jìn)行程序的模塊劃分,設(shè)計(jì)模塊之間如何相互調(diào)用來完成程序要求的功能。定義關(guān)鍵全局?jǐn)?shù)據(jù)結(jié)構(gòu),包括全局變量,用來存儲(chǔ)各模塊共享的數(shù)據(jù),以及定義全局常量。設(shè)計(jì)系統(tǒng)的自動(dòng)機(jī)模型,提前對(duì)關(guān)鍵的、較難解決的問題進(jìn)行處理。4第四頁,共53頁。3.概要設(shè)計(jì)要點(diǎn)概要設(shè)計(jì)主要從以下幾個(gè)方面考慮:用戶界面:界面友好,要能從界面提示信息了解火車的狀態(tài)和請(qǐng)求。自動(dòng)機(jī)模型:火車的行為可以用自動(dòng)機(jī)模型來描述。繪制狀態(tài)遷移圖,圖上需要描述引起狀態(tài)遷移的條件,并且要在文檔中附加說明進(jìn)入某狀態(tài)要做的動(dòng)作。全局?jǐn)?shù)據(jù)結(jié)構(gòu):包括全局變量和常量等,較全面地給出各個(gè)模塊要共享的數(shù)據(jù)。程序模塊化:函數(shù)接口說明,函數(shù)調(diào)用關(guān)系說明。5第五頁,共53頁。用戶界面設(shè)計(jì)命令行版本,要求實(shí)現(xiàn)鍵盤輸入、命令行輸出,并將輸出結(jié)果記錄到文件。定義鍵盤輸入格式定義屏幕輸出格式定義輸出文件名稱和文件格式動(dòng)畫版本,要求實(shí)現(xiàn)圖形界面輸入、動(dòng)畫輸出,并將輸出結(jié)果記錄到文件。畫出圖形化界面中各個(gè)要素(如按鈕、輸入框、輸出動(dòng)畫等)說明界面中的各種操作定義輸出文件名稱和文件格式6第六頁,共53頁。自動(dòng)機(jī)模型設(shè)計(jì)針對(duì)“不同對(duì)象”,畫出對(duì)應(yīng)的狀態(tài)遷移圖汽車狀態(tài)圖(可分層次畫出)交通燈狀態(tài)圖第一層狀態(tài)第二層:行駛狀態(tài)細(xì)化7第七頁,共53頁。全局?jǐn)?shù)據(jù)結(jié)構(gòu)設(shè)計(jì)設(shè)計(jì)所有或多個(gè)模塊(函數(shù))都需要用到的公共變量或者常量全局常量定義汽車運(yùn)行方向常量設(shè)置#defineNORTH0#defineWEST1#defineSOUTH2#defineEAST3#defineSTOP4交通燈當(dāng)前顏色的狀態(tài)常量設(shè)置#defineRedS0//#defineGreenS1//8第八頁,共53頁。全局?jǐn)?shù)據(jù)結(jié)構(gòu)設(shè)計(jì)全局變量定義structCarAuto_A;//汽車AstructCarAuto_B;//汽車B全局?jǐn)?shù)據(jù)結(jié)構(gòu)定義汽車的結(jié)構(gòu):包括汽車的狀態(tài)(state)與汽車的坐標(biāo)structCar{intstate;doublex,y;};9第九頁,共53頁。程序模塊化設(shè)計(jì)模塊又稱構(gòu)件,在傳統(tǒng)的方法中指用一個(gè)名字就可調(diào)用的一段代碼。類似于高級(jí)語言中的過程、函數(shù)等。一個(gè)模塊可以包含一個(gè)或多個(gè)函數(shù)。10第十頁,共53頁。程序模塊化設(shè)計(jì)C語言中的模塊開發(fā)C語言允許一個(gè)程序由多個(gè)源文件組成。當(dāng)程序規(guī)模比較大時(shí),可以根據(jù)模塊化原則將程序分成多個(gè).c源文件,每個(gè)源文件看作是一個(gè)模塊,每個(gè)源文件中可包含一個(gè)或多個(gè)功能連接緊密的函數(shù)。在編譯該程序時(shí),可以以源文件為單位分別進(jìn)行編譯,產(chǎn)生對(duì)應(yīng)的目標(biāo)文件,然后再用鏈接程序?qū)⒍鄠€(gè)目標(biāo)文件鏈接成一個(gè)可執(zhí)行文件。C語言的這種編譯過程稱為分塊編譯,這種開發(fā)方法稱為分塊開發(fā)11第十一頁,共53頁。程序模塊化設(shè)計(jì)程序模塊化設(shè)計(jì)應(yīng)該說明程序的模塊結(jié)構(gòu),包括:整個(gè)程序分成哪幾個(gè)模塊(.C源文件)?每一個(gè)文件里面包含哪些函數(shù)?函數(shù)原型說明。圖示說明模塊間調(diào)用關(guān)系(即模塊間函數(shù)的調(diào)用關(guān)系)。模塊1模塊2模塊3模塊4模塊5模塊6每個(gè)模塊是一個(gè).C文件12第十二頁,共53頁。程序模塊化設(shè)計(jì)在確定一個(gè)程序要?jiǎng)澐殖蓭讉€(gè)模塊(源文件),每一個(gè)源文件要包含哪些函數(shù)時(shí),需要以提高模塊獨(dú)立性為原則,將相關(guān)的功能放在一起,形成一個(gè)源文件。原則:高內(nèi)聚、低耦合13第十三頁,共53頁。通常,一個(gè)程序包含如下幾個(gè)部分:輸入處理:負(fù)責(zé)接收程序的輸入信息,將其存儲(chǔ)到內(nèi)存。如鍵盤輸入、圖形化輸入(鼠標(biāo)點(diǎn)擊等)、文件輸入等。輸出處理:負(fù)責(zé)輸出程序的結(jié)果信息。如屏幕輸出、圖形化輸出(輸出火車、輸出軌道、輸出探測(cè)點(diǎn)等)、文件輸出等。數(shù)據(jù)處理:負(fù)責(zé)對(duì)輸入信息進(jìn)行各種策略處理,將其轉(zhuǎn)化為最終的結(jié)果信息。數(shù)據(jù)處理按照程序內(nèi)部不同的子功能可劃分成不同的獨(dú)立子模塊,如火車狀態(tài)處理、火車控制策略、公共軌道狀態(tài)處理等。程序總調(diào)度:通常由主函數(shù)完成,單獨(dú)一個(gè)模塊。負(fù)責(zé)對(duì)以上所有模塊按照一定順序進(jìn)行調(diào)度。14第十四頁,共53頁。程序模塊化設(shè)計(jì)程序總調(diào)度輸入處理輸出處理數(shù)據(jù)處理15第十五頁,共53頁。模塊接口說明模塊文件模塊說明模塊包含的函數(shù)名函數(shù)功能

XXX.c功能說明

intfunction1(void)

voidfunction2

(float)

序號(hào)函數(shù)原型功能參數(shù)

返回值

1

intfunction1(void)

何時(shí)何條件被何模塊調(diào)用?完成什么功能?參數(shù)描述

返回值描述

2voidfunction2

(float)

參數(shù)描述

返回值描述表2函數(shù)說明表1模塊說明16第十六頁,共53頁。程序模塊化設(shè)計(jì)概要設(shè)計(jì)報(bào)告1用戶界面設(shè)計(jì)命令行方式、文件方式、動(dòng)畫方式2有限狀態(tài)自動(dòng)機(jī)狀態(tài)轉(zhuǎn)換圖3高層數(shù)據(jù)結(jié)構(gòu)定義包括:全局常量定義、全局?jǐn)?shù)據(jù)結(jié)構(gòu)定義4系統(tǒng)模塊劃分畫出系統(tǒng)模塊的調(diào)用關(guān)系圖;并詳細(xì)說明各個(gè)模塊的功能。17第十七頁,共53頁。程序模塊化設(shè)計(jì)頭文件的確定把所有公用的類型定義(結(jié)構(gòu)、聯(lián)合或枚舉聲明),公用的宏定義放在適當(dāng)?shù)念^文件中,供各個(gè)文件參考。如果在許多地方都使用一個(gè)(些)標(biāo)準(zhǔn)頭文件,或者某個(gè)頭文件本身需要,則可以把標(biāo)準(zhǔn)頭文件包含到一個(gè)自己定義的頭文件里供使用。如果只有一個(gè)源文件需要某個(gè)標(biāo)準(zhǔn)頭文件,則不要將它放在公共的頭文件中,而是讓這個(gè)源文件直接包含它,以提高編譯效率。對(duì)于所有在一個(gè)源文件里定義、而在其他文件中使用的東西(函數(shù)原型或者變量的外部聲明),都需要在某個(gè)頭文件中聲明,以方便使用。18第十八頁,共53頁。程序模塊化設(shè)計(jì)源文件設(shè)計(jì)時(shí)要注意以下問題:每個(gè)源文件只包含必要的頭文件,不用的東西盡量不包含。如果源文件既要包含標(biāo)準(zhǔn)頭文件,又要包含自定義頭文件,則應(yīng)將標(biāo)準(zhǔn)頭文件寫在前面,以防止本程序的局部定義影響標(biāo)準(zhǔn)庫文件里的定義。在一個(gè)源文件中,所有局部的東西都寫在各自的函數(shù)中;所有只在本文件范圍內(nèi)使用的外部變量和函數(shù),都使用static關(guān)鍵字定義為外部靜態(tài)的。對(duì)于多個(gè)函數(shù)都需要訪問的變量,應(yīng)該根據(jù)誰使用誰管理的歸屬原則,分別定義為不同源文件里的外部變量。在許多文件中都使用的全局變量,一般在主程序文件里定義。19第十九頁,共53頁。提綱1.軟件概要設(shè)計(jì)和模塊化2.使用線程實(shí)現(xiàn)任務(wù)并發(fā)3.時(shí)間控制函數(shù)20第二十頁,共53頁。1.使用線程實(shí)現(xiàn)任務(wù)并發(fā)問題的引出:以電梯控制系統(tǒng)為例目前能想到的程序主體結(jié)構(gòu)main(){while(1){state_trans();//計(jì)算此刻電梯的狀態(tài)

print_message();//輸出電梯此刻的狀態(tài),包括動(dòng)畫get_input();//接收當(dāng)前時(shí)刻的新輸入(包括新目

標(biāo)和新呼叫)control();/*根據(jù)控制策略確定下一目標(biāo)樓層,

在state_trans()中要用到*/time_count();//時(shí)間片推進(jìn)一個(gè)}}思考:上述結(jié)構(gòu)不合理之處?

21第二十一頁,共53頁。1.使用線程實(shí)現(xiàn)任務(wù)并發(fā)上述結(jié)構(gòu)不合理之處:計(jì)算和輸出電梯狀態(tài)與接收服務(wù)請(qǐng)求是串行的,與現(xiàn)實(shí)中的電梯運(yùn)行不符!程序結(jié)構(gòu)的改進(jìn):

從上述代碼中刪除get_input(),從而實(shí)現(xiàn)每隔一小段時(shí)間就刷新電梯當(dāng)前狀態(tài)main(){while(1){state_trans();//計(jì)算此刻電梯的狀態(tài)

print_message();//輸出電梯此刻的狀態(tài) control();/*根據(jù)控制策略確定下一目標(biāo)樓層,這

在state_trans()中要用到*/time_count();//時(shí)間片推進(jìn)一個(gè)}}22第二十二頁,共53頁。1.使用線程實(shí)現(xiàn)任務(wù)并發(fā)但是,程序必須要能接收電梯服務(wù)請(qǐng)求,如何處理服務(wù)請(qǐng)求的輸入?理想狀態(tài):電梯服務(wù)請(qǐng)求的接收和電梯狀態(tài)的計(jì)算輸出能同時(shí)進(jìn)行,互不影響但是,能否實(shí)現(xiàn)?答案是:使用線程電梯狀態(tài)計(jì)算和輸出共享內(nèi)存區(qū)接收服務(wù)請(qǐng)求23第二十三頁,共53頁。1.使用線程實(shí)現(xiàn)任務(wù)并發(fā)進(jìn)程一個(gè)正在運(yùn)行的程序的實(shí)例,是一個(gè)程序在其自身的地址空間中的一次執(zhí)行活動(dòng),例如用字處理軟件編輯文稿時(shí),同時(shí)打開mp3播放程序聽音樂,這兩個(gè)獨(dú)立的程序在同時(shí)運(yùn)行,稱為兩個(gè)進(jìn)程進(jìn)程是資源申請(qǐng)、調(diào)度和獨(dú)立運(yùn)行的單位24第二十四頁,共53頁。1.使用線程實(shí)現(xiàn)任務(wù)并發(fā)線程線程是系統(tǒng)分配處理器時(shí)間資源的基本單元。對(duì)于操作系統(tǒng)而言,其調(diào)度單元是線程(為線程提供時(shí)間片,線程在自己的時(shí)間片內(nèi)運(yùn)行)。一個(gè)程序中多段代碼同時(shí)并發(fā)執(zhí)行,稱為多線程譬如用word同時(shí)打開多個(gè)文檔進(jìn)行編輯,用IE瀏覽器同時(shí)訪問多個(gè)網(wǎng)站通過多線程,一個(gè)進(jìn)程表面上看同時(shí)可以執(zhí)行一個(gè)以上的任務(wù)——并發(fā)25第二十五頁,共53頁。線程(續(xù))一個(gè)進(jìn)程至少包括一個(gè)線程(稱為主線程)。一個(gè)進(jìn)程從主線程的執(zhí)行開始進(jìn)而創(chuàng)建一個(gè)或多個(gè)附加線程,就是所謂基于多線程的多任務(wù)。線程自己不擁有系統(tǒng)資源,但它可與同屬一個(gè)進(jìn)程的其它線程共享進(jìn)程所擁有的全部資源26第二十六頁,共53頁。1.使用線程實(shí)現(xiàn)任務(wù)并發(fā)在C程序中要?jiǎng)?chuàng)建線程,可以調(diào)用Windows操作系統(tǒng)提供的創(chuàng)建線程的函數(shù)CreateThread:HANDLE

CreateThread(

LPSECURITY_ATTRIBUTES

lpThreadAttributes,

DWORD

dwStackSize,

LPTHREAD_START_ROUTINE

lpStartAddress,

LPVOID

lpParameter,

DWORD

dwCreationFlags,

LPDWORD

lpThreadId);

LPVOID是一個(gè)Void類型的指針,也就是說你可以將任意類型的指針賦值給LPVOID類型的變量。DWORD是32位無符號(hào)整數(shù)。27第二十七頁,共53頁。1.使用線程實(shí)現(xiàn)任務(wù)并發(fā)lpThreadAttributes表示創(chuàng)建線程的安全屬性,NT下有用??少x值為NULL。dwStackSize指定線程棧的尺寸,如果為0則與進(jìn)程主線程棧相同。lpStartAddress指定線程開始運(yùn)行的地址。賦值為指向函數(shù)的指針,即函數(shù)名。該函數(shù)的名稱任意,但函數(shù)類型必須遵照下述聲明形式: DWORDWINAPIThreadProc(LPVOIDlpParameter);否則需要進(jìn)行強(qiáng)制類型轉(zhuǎn)換lpParameter表示傳遞給線程的32位的參數(shù)(數(shù)值或指針)。若無參數(shù)則賦值為NULL。dwCreationFlags表示是否創(chuàng)建后掛起線程(取值CREATE_SUSPENDED表示掛起,取值0表示創(chuàng)建后立即運(yùn)行),掛起后調(diào)用ResumeThread繼續(xù)執(zhí)行。若不掛起則賦值為0。lpThreadId用來存放返回的線程ID。

DWORDThreadID1=1;HANDLEhRead1=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)getInput, NULL,0,&ThreadID1);28第二十八頁,共53頁。#include<stdio.h>#include<windows.h>DWORDWINAPIFun1Proc(LPVOIDlpParameter);intmain(){ HANDLEhThreadl;//<1> hThreadl=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);//<2> CloseHandle(hThreadl);//<3> printf("mainthreadisrunning\n");//<4> return0;}DWORDWINAPIFun1Proc(LPVOIDlpParameter){ printf("hThreadlisrunning\n"); return0;}例129第二十九頁,共53頁。#include<stdio.h>#include<windows.h>DWORDWINAPIFun1Proc(LPVOIDlpParameter)intmain(){ HANDLEhThreadl;//<1> hThreadl=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);//<2> CloseHandle(hThreadl);//<3> printf("mainthreadisrunning\n");//<4>Sleep(10);//讓線程睡眠10毫秒 return0;}例230第三十頁,共53頁。#include<stdio.h>#include<windows.h>intindex=0;DWORDWINAPIFun1Proc(LPVOIDlpParameter);intmain(){ HANDLEhThreadl;//<1> hThreadl=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);//<2> CloseHandle(hThreadl);//<3> while(index++<1000) { printf("mainthreadisrunning\n");//<4> } return0;}例3DWORDWINAPIFun1Proc(LPVOIDlpParameter){ while(index++<1000) { printf("hThreadlisrunning\n"); } return0;}31第三十一頁,共53頁。32第三十二頁,共53頁。#include<stdio.h>#include<windows.h>inttickets=100;DWORDWINAPIFun1Proc(LPVOIDpPararneter){ while(tickets>0) printf(“thread1sellticket:%d\n”,tickets--); return0;}DWORDWINAPIFun2Proc(LPVOIDpPararneter){while(tickets>0)printf(“thread2sellticket:%d\n”,tickets--);return0;}33第三十三頁,共53頁。intmain(){ HANDLEhThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL); HANDLEhThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL); CloseHandle(hThread1); CloseHandle(hThread2); Sleep(4000); return0;}34第三十四頁,共53頁。35第三十五頁,共53頁。線程的同步利用互斥對(duì)象(mutex)實(shí)現(xiàn)線程的同步,互斥對(duì)象能夠確保線程擁有對(duì)單個(gè)資源的互斥訪問權(quán)。3個(gè)操作互斥對(duì)象的創(chuàng)建互斥對(duì)象的釋放互斥對(duì)象的請(qǐng)求36第三十六頁,共53頁?;コ鈱?duì)象的創(chuàng)建HANDLECreateMutex(LPSECURITY_ATTRIBUTESlpMutexAttributes,BOOLbinitialOwner,LPCTSTRlpNarne)lpMutexAttributes:可以給該參數(shù)傳遞NULL值,讓互斥對(duì)象使用默認(rèn)的安全性binitialOwner:BOOL類型,指定互斥對(duì)象初始的擁有者。如果該值為真,則創(chuàng)建這個(gè)互斥對(duì)象的線程獲得該對(duì)象的所有權(quán);否則,該線程將不獲得所創(chuàng)建的互斥對(duì)象的所有權(quán)。lpName:指定互斥對(duì)象的名稱。如果此參數(shù)為NULL.則創(chuàng)建一個(gè)匿名的互斥對(duì)象。如果調(diào)用成功,該函數(shù)將返回所創(chuàng)建的互斥對(duì)象的句柄37第三十七頁,共53頁?;コ鈱?duì)象的釋放BOOLReleaseMutex(HANDLEhMutex);

ReleaseMutex函數(shù)只有一個(gè)HANDLE類型的參數(shù),即需要釋放的互斥對(duì)象的句柄。該函數(shù)的返回值是BOOL類型,如果函數(shù)調(diào)用成功,返回非0值;否則返回0值。38第三十八頁,共53頁?;コ鈱?duì)象的請(qǐng)求DWORDWaitForSingleObject(HANDLEhHandle,DWORDdwMilliseconds);Handle:所請(qǐng)求的互斥對(duì)象的句柄。一旦互斥對(duì)象處于有信號(hào)狀態(tài),則該函數(shù)就返回。如果該互斥對(duì)象始終處于無信號(hào)狀態(tài),即未通知的狀態(tài),則該函數(shù)就會(huì)一直等待,這樣就會(huì)暫停線程的執(zhí)行。dwMilliseconds:指定等待的時(shí)間間隔,以毫秒為單位。如果指定的時(shí)間間隔己過,即使所請(qǐng)求的對(duì)象仍處于無信號(hào)狀態(tài),WaitForSingleObject函數(shù)也會(huì)返回。如果將此參數(shù)設(shè)置為0,那么WaitForSingleObject函數(shù)將測(cè)試該對(duì)象的狀態(tài)并立即返回;如果將此參數(shù)設(shè)置為INFINITE,則該函數(shù)會(huì)永遠(yuǎn)等待,直到等待的對(duì)象處于有信號(hào)狀態(tài)才會(huì)返回。調(diào)用WaitForSingleObject函數(shù)后,該函數(shù)會(huì)一直等待,只有在以下兩種情況下才會(huì)返回:1)指定的對(duì)象變成有信號(hào)狀態(tài)。2)指定的等待時(shí)間間隔己過。39第三十九頁,共53頁。HANDLEhMutex;inttickets=100;

DWORDWINAPIFun1Proc(LPVOIDpPararneter){ while(tickets>0) { WaitForSingleObject(hMutex,INFINITE); if(tickets>0) printf("thread1sellticket:%d\n",tickets--); ReleaseMutex(hMutex); } return0;}40第四十頁,共53頁。DWORDWINAPIFun2Proc(LPVOIDpPararneter){ while(tickets>0) { WaitForSingleObject(hMutex,INFINITE); if(tickets>0) printf("thread2sellticket:%d\n",tickets--); ReleaseMutex(hMutex); } return0;}41第四十一頁,共53頁。intmain(){ HANDLEhThread1,hThread2; hMutex=CreateMutex(NULL,FALSE,NULL); hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL); hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL); CloseHandle(hThread1); CloseHandle(hThread2); Sleep(4000); return0;}42第四十二頁,共53頁。線程在電梯控制系統(tǒng)中的使用考慮現(xiàn)實(shí)中安裝在電梯上的軟件:接收電梯服務(wù)請(qǐng)求和計(jì)算電梯狀態(tài)、從而控制電梯的運(yùn)行是并行的因此我們可以考慮在模擬電梯控制系統(tǒng)中設(shè)計(jì)一個(gè)線程專門用于接收電梯服務(wù)請(qǐng)求,另一個(gè)線程實(shí)行電梯的狀態(tài)計(jì)算和狀態(tài)輸出電梯狀態(tài)計(jì)算和輸出線程共享內(nèi)存區(qū)接收服務(wù)請(qǐng)求電梯狀態(tài)計(jì)算和輸出:從共享內(nèi)存區(qū)讀取電梯請(qǐng)求,計(jì)算下一目標(biāo)樓層,從而確定電梯的下一狀態(tài)。接收服務(wù)請(qǐng)求:接收電梯請(qǐng)求,將請(qǐng)求保存到內(nèi)存。43第四十三頁,共53頁。//主線程main(){DWORDThreadID;//創(chuàng)建線程(對(duì)應(yīng)于函數(shù)input()),用于接收電梯輸入;

HANDLEhRead=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)getInput,NULL,0,&ThreadID);

//進(jìn)行變量初始化工作

線程在電梯控制系統(tǒng)中的使用44第四十四頁,共53頁。while(1){state_trans();();//根據(jù)自動(dòng)機(jī)模型決定此刻電梯的狀態(tài)

print_message();/*輸出電梯此刻的狀態(tài)*/

control();/*根據(jù)控制策略確定下一目標(biāo)樓層,這在 state_trans()中要用到*/time_count();/*時(shí)間片推進(jìn)一個(gè)*/}}線程在電梯控制系統(tǒng)中的使用45第四十五頁,共53頁。//接收輸入線程voidgetInput(void){charch;while(1){ ch=getchar();//加入代碼:將ch翻譯成相應(yīng)請(qǐng)求并保存;

time_count();//時(shí)間片推進(jìn)一個(gè);

}}線程在電梯控制系統(tǒng)中的使用46第四十六頁,共53頁。提綱1.軟件概要設(shè)計(jì)和模塊化2.使用線程實(shí)現(xiàn)任務(wù)并發(fā)3.時(shí)間控制函數(shù)47第四十七頁,共53頁。4.1-計(jì)時(shí)函數(shù)while(1){state_trans();();//根據(jù)自動(dòng)機(jī)模型決定此刻電梯的狀態(tài)

print_message();/*輸出電梯此刻的狀態(tài)*/

control();/*根據(jù)控制策略確定下一目標(biāo)樓層,這在 state_trans()中要用到*/

time_count();/*時(shí)間片推進(jìn)一個(gè)*/}}48第四十八頁,共53頁。4.1-計(jì)時(shí)函數(shù)clock_tclock(void);

ANSI標(biāo)準(zhǔn)庫中的time.h頭文件,其中定義了日期和時(shí)間的處理函數(shù)。

這個(gè)函數(shù)返回從“啟動(dòng)程序”到“程序中調(diào)用clock()函數(shù)”之間的CPU時(shí)鐘計(jì)時(shí)單元(clocktick)數(shù),在MSDN中稱之為掛鐘時(shí)間(wal-clock)。其中clock_t是用來保存時(shí)間的數(shù)據(jù)類型,長(zhǎng)整型。clocktick:CPU時(shí)鐘計(jì)時(shí)單元,時(shí)間長(zhǎng)短由CPU控制。一個(gè)clocktick不是CPU的一個(gè)時(shí)鐘周期,而是C/C++的一個(gè)基本計(jì)時(shí)單位。常量CLOCKS_PER_SEC,它表示一秒鐘會(huì)有多少個(gè)時(shí)鐘計(jì)時(shí)單元

??梢允褂霉絚lock()/CLOCKS_PER_SEC來計(jì)算一個(gè)進(jìn)程自身的運(yùn)行時(shí)間。49第四十九頁,共53頁。

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論