WORK.CPP
上传用户:wszmarenbt
上传日期:2013-04-26
资源大小:2552k
文件大小:6k
源码类别:

Windows编程

开发平台:

Visual C++

  1. #include<stdio.h>
  2. #include<iostream.h>
  3. #include<bios.h>
  4. #include<dos.h>
  5. #include<stdlib.h>
  6. #include<graphics.h>
  7. #include<conio.h>
  8. #define READY 0
  9. #define RUNNING 1
  10. typedef struct ProcType ;
  11. struct ProcType{
  12. int ID;
  13. int Status;
  14. struct time ArriTime;
  15. struct time RunTime;
  16. int SerTime;
  17. int StartP;
  18. int Resource;
  19. };
  20. ProcType Proc[100];
  21. struct ConType{
  22. int First;
  23. int ProcNum;
  24. int Free;
  25. }Control;
  26. struct MemType{
  27. int ID;
  28. int Flag;
  29. }Mem[50];
  30. struct xyType{
  31. int lx;
  32. int rx;
  33. int ly;
  34. int ry;
  35. }xy;
  36. int WaitArr[50];
  37. int wh=0;
  38. int wt=0;
  39. int Tail=0;
  40. int Number=-1;
  41. void Initgraph()
  42. {
  43. int gdriver = DETECT, gmode;
  44. registerbgidriver(EGAVGA_driver);
  45. initgraph(&gdriver, &gmode, "");
  46. }
  47. void Waiting()
  48. {
  49. setcolor(YELLOW);
  50. settextstyle(DEFAULT_FONT,HORIZ_DIR,2);
  51. outtextxy(200,170,"Press SOME keys");
  52. outtextxy(150,250,"to produce processes... ...");
  53. while(!kbhit()){};
  54. delay(3000);
  55. settextstyle(DEFAULT_FONT,HORIZ_DIR,1);
  56. }
  57. void Closegraph()
  58. {
  59. closegraph();
  60. }
  61. int ranres(void)
  62. {
  63. int i,a,size;
  64. size=1;
  65. a=random(4);
  66. for(i=0;i<a;i++)
  67. {
  68. size=size*2;
  69. }
  70. printf("na=%d",a);
  71. printf("size=%d",size);
  72. return size;
  73. }
  74. int rantime(void)
  75. {
  76. int b,time;
  77. time=1;
  78. b=random(4);
  79. time=(b+1)*5;
  80. return time;
  81. }
  82. struct time biuldtime(void)
  83. {
  84. struct time t;
  85. gettime(&t);
  86. return t;
  87. }
  88. void biuldwait(int id)
  89. {
  90. Proc[id].ID=id;
  91. Proc[id].SerTime=rantime();
  92. Proc[id].Resource=ranres();
  93. WaitArr[wt]=id;
  94. wt++;
  95. }
  96. void biuldmem(void)
  97. {
  98. int a,i,id;
  99. a=Proc[WaitArr[wh]].Resource;
  100. while(a<=Control.Free&&(wh!=wt))
  101. {
  102. id=WaitArr[wh];
  103. Proc[id].ArriTime=biuldtime();
  104. Proc[id].StartP=Tail; /*Don't forget the initial of the Tail*/
  105. Proc[id].Status=READY;
  106. for(i=0;i<Proc[id].Resource;i++)
  107. Mem[Tail+i].Flag=1;
  108. Control.ProcNum++;
  109. Control.Free-=Proc[id].Resource;
  110. Tail+=Proc[id].Resource;
  111. wh++;
  112. a=Proc[WaitArr[wh]].Resource;
  113. }
  114. }
  115. struct xyType getxy(int id)
  116. {
  117. int a,b;
  118. struct xyType xy;
  119. a=id%10;
  120. b=int(id/10);
  121. xy.lx=100+a*40;xy.ly=250+b*30;
  122. xy.rx=125+a*40;xy.ry=260+b*30;
  123. return xy;
  124. }
  125. int retcolor(int id)
  126. {
  127. if (id==1) return 12;
  128. if (id==2) return 1;
  129. if (id==4) return 10;
  130. if (id==8) return 14;
  131. else return 0;
  132. }
  133. void drawgrid(void)
  134. {
  135. int i;
  136. setcolor(12);
  137. moveto(10,430);
  138. lineto(620,430);
  139. setcolor(11);
  140. outtextxy(40,40,
  141. "*-*-*-*-*-*-*-*-*-The Memory Distribution Of The Process"
  142. "-*-*-*-*-*-*-*-*-*");
  143. setcolor(13);
  144. outtextxy(160,80,"--**-- Color Declaration --**--");
  145. for(i=0;i<7;i++)
  146. {
  147. moveto(200,100+i*20);
  148. lineto(400,100+i*20);
  149. }
  150. for(i=0;i<3;i++)
  151. {
  152. moveto(200+i*100,100);
  153. lineto(200+i*100,220);
  154. }
  155. setcolor(14);
  156. outtextxy(205,105,"Color");outtextxy(305,105,"Process Size");
  157. setcolor(12);
  158. outtextxy(210,125,"RED");outtextxy(330,125,"1 M");
  159. setcolor(1);
  160. outtextxy(210,145,"BLUE");outtextxy(330,145,"2 M");
  161. setcolor(10);
  162. outtextxy(210,165,"GREEN");outtextxy(330,165,"4 M");
  163. setcolor(14);
  164. outtextxy(210,185,"YELLOW");outtextxy(330,185,"8 M");
  165. setcolor(15);
  166. outtextxy(210,205,"WHITE");outtextxy(330,205,"FREE");
  167. }
  168. void drawrun(void)
  169. {
  170. int i,k,size,id,timesub,color,j=0,a;
  171. char msg[50];
  172. struct time t,st;
  173. id=Control.First;
  174. Proc[id].RunTime=biuldtime();
  175. st=Proc[id].RunTime;
  176. size=Proc[Control.First].Resource;
  177. gettime(&t);
  178. timesub=(t.ti_hour*60*60*100+t.ti_min*60*100+t.ti_sec*100+t.ti_hund)
  179. -(st.ti_hour*60*60*100+st.ti_min*60*100+st.ti_sec*100+st.ti_hund);
  180. a=0;
  181. while(timesub<=5*Proc[id].SerTime)
  182. {
  183. color=5+j%10;
  184. j++;
  185. setfillstyle(6,color);
  186. for(i=0;i<size;i++)
  187. {
  188. bar(getxy(i).lx,getxy(i).ly,getxy(i).rx,getxy(i).ry);
  189. }
  190. gettime(&t);
  191. timesub=(t.ti_hour*60*60*100+t.ti_min*60*100+t.ti_sec*100+t.ti_hund)
  192. -(st.ti_hour*60*60*100+st.ti_min*60*100+st.ti_sec*100+st.ti_hund);
  193. setcolor(11);
  194. sprintf(msg,"The process %d is running... ...",(id+1));
  195. outtextxy(30,450,msg);
  196. setcolor(YELLOW);
  197. outtextxy(150,395,"Now you can ALSO press "
  198. "any key to produce processes... ...");
  199. setcolor(11);
  200. outtextxy(5,395,"* Time Show *");
  201. moveto(10+a,410);
  202. lineto(10+a,425);
  203. a++;
  204. }
  205. setfillstyle(1,WHITE);
  206. for(i=0;i<size;i++)
  207. {
  208. bar(getxy(i).lx,getxy(i).ly,getxy(i).rx,getxy(i).ry);
  209. }
  210. }
  211. void drawother(void)
  212. {
  213. int id,i;
  214. for(id=Control.First+1;id<(Control.First+Control.ProcNum);id++)
  215. {
  216. setfillstyle(1,retcolor(Proc[id].Resource));
  217. for(i=Proc[id].StartP;i<Proc[id].StartP+Proc[id].Resource;i++)
  218. bar(getxy(i).lx,getxy(i).ly,getxy(i).rx,getxy(i).ry);
  219. }
  220. }
  221. void drawfree(void)
  222. {
  223. int i;
  224. setfillstyle(1,WHITE);
  225. for(i=Tail;i<50;i++)
  226. {
  227. bar(getxy(i).lx,getxy(i).ly,getxy(i).rx,getxy(i).ry);
  228. }
  229. }
  230. void run(void)
  231. {
  232. int id;
  233. id=Control.First;
  234. Proc[id].Status=RUNNING;
  235. drawother();
  236. drawfree();
  237. drawrun();
  238. }
  239. void finish(void)
  240. {
  241. int id;
  242. int i;
  243. id=Control.First;
  244. for(i=0;i<Proc[id].Resource;i++)
  245. Mem[i].Flag=0;
  246. Control.ProcNum--;
  247. Control.Free+=Proc[id].Resource;
  248. }
  249. void compress(void)
  250. {
  251. int i,j,k;
  252. i=0;j=0;
  253. while(Mem[i].Flag==1) i++; /*i point to the first "0" */
  254. j=i;
  255. while(Mem[j].Flag==0&&j<(i+8)) j++; /*j point to the first "1" */
  256. while(Mem[j].Flag==1)
  257. {
  258. Mem[i].Flag=1;
  259. Mem[j].Flag=0;
  260. for(k=0;k<(Control.ProcNum+1);k++) /*Control.ProcNum+1=The procnum befor*/
  261. {
  262. if(Proc[Control.First+k].StartP==j)
  263. Proc[Control.First+k].StartP=i;
  264. }
  265. i++;j++;
  266. }
  267. Control.First++;
  268. Tail=i; /*Tail point to the first "0" after compress */
  269. }
  270. void display(void)
  271. {
  272. int i;
  273. int id;
  274. for(id=Control.First;id<(Control.First+Control.ProcNum);id++)
  275. {
  276. setfillstyle(1,retcolor(Proc[id].Resource));
  277. for(i=Proc[id].StartP;i<Proc[id].StartP+Proc[id].Resource;i++)
  278. bar(getxy(i).lx,getxy(i).ly,getxy(i).rx,getxy(i).ry);
  279. }
  280. drawfree();
  281. }
  282. void runkernel(void)
  283. {
  284. cleardevice();
  285. setbkcolor(0);
  286. int id,l,count=0;
  287. Control.First=0;
  288. Control.Free=50;
  289. id=Number+1;
  290. while((Control.Free<50)||(Number==-1))
  291. {
  292. while(bioskey(1)!=0)
  293. {
  294. count++;
  295. bioskey(0);
  296. biuldwait(id);
  297. id++;
  298. Number++;
  299. }
  300. if((wt==wh&&wh==0)||(wt!=wh)) biuldmem();/*Biuld all can*/
  301. cleardevice();
  302. setbkcolor(0);
  303. drawgrid();
  304. run();
  305. finish();
  306. compress();
  307. display();
  308. delay(2000);
  309. }
  310. setcolor(0);
  311. for(int a=0;a<629;a++)
  312. {
  313. moveto(a,390);
  314. lineto(a,425);
  315. moveto(a,445);
  316. lineto(a,460);
  317. }
  318. setcolor(YELLOW);
  319. outtextxy(180,450,"All the processes have been done!");
  320. getch();
  321. }
  322. int main(void)
  323. {
  324. Initgraph();
  325. Waiting();
  326. runkernel();
  327. Closegraph();
  328. return 0;
  329. }