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

Windows编程

开发平台:

Visual C++

  1. #include  <math.h>
  2. #include "Windw.h"
  3. #define MAX    100
  4. #define SIZE    50
  5. class PCB
  6. {
  7. private :
  8. int ID;
  9. int Size;
  10. int Ts;
  11. int Flag;
  12. public :
  13. PCB()
  14. {
  15. ID=0;
  16. Size=0;
  17. Ts=0;
  18. Flag=0;
  19. }
  20. void SetID(int I){ID=I;}
  21. void SetMFlag(){Flag=1;}
  22. void SetDFlag(){Flag=0;}
  23. void SetSizeTs(void)
  24. {
  25. int number;
  26. randomize();
  27. number=rand()%4;
  28. Size=ldexp(2,number-1);
  29. Ts=(number+1)*5;
  30. }
  31. int GetFlag(void) {return Flag;}
  32. int GetID(void){return ID;}
  33. int GetSize(void){return Size;}
  34. int GetTs(void){return Ts;}
  35. };
  36. class Rectangle
  37. {
  38. friend class Grid;
  39. private :
  40. int left,top,right,bottom;
  41. char content[SIZE];
  42. public :
  43. void Outtextxy(char text[SIZE])
  44. {
  45. strcpy(content,text);
  46. outtextxy(left+9,top+7,content);
  47. }
  48. void Fill(int Number)
  49. {
  50. setfillstyle(SOLID_FILL,Number);
  51. bar3d(left+1,top+1,right-1,bottom-1,0,0);
  52. }
  53. void Test(int Temp,int Interval)
  54. {
  55. if (Temp==0) outtextxy(left+45+Interval,top+7,"0");
  56. if (Temp==1) outtextxy(left+45+Interval,top+7,"1");
  57. if (Temp==2) outtextxy(left+45+Interval,top+7,"2");
  58. if (Temp==3) outtextxy(left+45+Interval,top+7,"3");
  59. if (Temp==4) outtextxy(left+45+Interval,top+7,"4");
  60. if (Temp==5) outtextxy(left+45+Interval,top+7,"5");
  61. if (Temp==6) outtextxy(left+45+Interval,top+7,"6");
  62. if (Temp==7) outtextxy(left+45+Interval,top+7,"7");
  63. if (Temp==8) outtextxy(left+45+Interval,top+7,"8");
  64. if (Temp==9) outtextxy(left+45+Interval,top+7,"9");
  65. }
  66. void Display(int number)
  67. {
  68. int Temp=number;
  69. if ((Temp>=0) && (Temp<=9)) Test(Temp,0);
  70. if ((Temp>=10) && (Temp<=99))
  71. {
  72. Temp=int (Temp/10);
  73. Test(Temp,0);
  74. Temp=number-Temp*10;
  75. Test(Temp,5);
  76. }
  77. }
  78. };
  79. class Grid
  80. {
  81. private :
  82. Rectangle *Array[MAX];
  83. public :
  84. Grid(){};
  85. void NewRectangle(int number,int a,int b,int c,int d)
  86. {
  87. Rectangle *Newrect;
  88. Newrect=new Rectangle;
  89. Newrect->left=a;
  90. Newrect->top=b;
  91. Newrect->right=c;
  92. Newrect->bottom=d;
  93. rectangle(a,b,c,d);
  94. Array[number]=Newrect;
  95. }
  96. Rectangle *GetRectangle(int number) {return Array[number];}
  97. };
  98. void Exit(void);
  99. void Version(void);
  100. void Running(void);
  101. void InitGrid(void);
  102. void InitGraph(void);
  103. void InitRecord(void);
  104. void Allocation(void);
  105. void Compact(int number);
  106. int  Returncolor(int number);
  107. Grid Record,Graph;
  108. PCB MEMORY[MAX];
  109. PCB HARDDISK[MAX];
  110. int Screen[MAX];
  111. int CurrentMIDM=0,CurrentMIDD=0,CurrentMMp=0,CurrentMDp=0;
  112. int LeftSpace=SIZE,LeftD=SIZE,CurrentEIDM,CurrentEIDD;
  113. int main()
  114. {
  115. int i;
  116. InitGraph();
  117. InitRecord();
  118. InitGrid();
  119. EventMsg eventMsg;
  120. mouse.SetLimits(0,getmaxx(),0,getmaxy());
  121. mouse.ShowMouse();
  122. Button wndw1(220,360,"^OK");
  123. Button wndw2(300,360,"^CANCEL");
  124. wndw1.DrawWindow();
  125. wndw2.DrawWindow();
  126. int button=0;
  127. while (!button)
  128. {
  129. GetEvent(eventMsg);
  130. if (wndw1.Clicked(eventMsg)) Allocation();
  131. if (wndw2.Clicked(eventMsg)) button=CANCEL;
  132. else if (!wndw1.Clicked(eventMsg)&&!wndw2.Clicked(eventMsg))
  133. Running();
  134. }
  135. Exit();
  136. return 0;
  137. }
  138. void Exit(void)
  139. {
  140. mouse.HideMouse();
  141. Version();
  142. getch();
  143. closegraph();
  144. exit(1);
  145. }
  146. void InitGraph(void)
  147. {
  148. int Gdriver=DETECT,Gmode,Errorcode;
  149. initgraph(&Gdriver,&Gmode,"D:\Tools\Tc3.0\Bgi");
  150. Errorcode=graphresult();
  151. if (Errorcode!=grOk)
  152. {
  153. printf("Graphics Error: %sn",grapherrormsg(Errorcode));
  154. printf("Press any key to exit & Change the dictory :");
  155. getch();
  156. exit(1);
  157. }
  158. }
  159. void InitRecord(void)
  160. {
  161. int number=0,circle,i;
  162. for (i=0;i<5;i++)
  163. {
  164. for (circle=0;circle<6;circle++)
  165. {
  166. Record.NewRectangle(number,15+circle*100,20+i*20,
  167. circle*100+115,20+((i+1)*20));
  168. number=number+1;
  169. }
  170. }
  171. setcolor(14);
  172. Record.GetRectangle(0)->Outtextxy("   SIZE   ");
  173. Record.GetRectangle(1)->Outtextxy(" INTERVAL ");
  174. Record.GetRectangle(2)->Outtextxy("  TOTAL   ");
  175. Record.GetRectangle(3)->Outtextxy("  READY   ");
  176. Record.GetRectangle(4)->Outtextxy("  RUNNING ");
  177. Record.GetRectangle(5)->Outtextxy("  COLOR   ");
  178. setcolor(12);
  179. Record.GetRectangle(6)->Outtextxy("    1M    ");
  180. Record.GetRectangle(12)->Outtextxy("    2M    ");
  181. Record.GetRectangle(18)->Outtextxy("    4M    ");
  182. Record.GetRectangle(24)->Outtextxy("    8M    ");
  183. for (i=7,circle=0;i<=25,circle<4;i=i+6,circle++)
  184. Record.GetRectangle(i)->Display(i-circle-2);
  185. setcolor(15);
  186. for (i=8,circle=0;i<=26,circle<4;i=i+6,circle++)
  187. Record.GetRectangle(i)->Outtextxy("  Random  ");
  188. for (i=9,circle=0;i<=27,circle<4;i=i+6,circle++)
  189. Record.GetRectangle(i)->Outtextxy("  Random  ");
  190. for (i=10,circle=0;i<=28,circle<4;i=i+6,circle++)
  191. Record.GetRectangle(i)->Outtextxy("  Random  ");
  192. setcolor(12);
  193. Record.GetRectangle(11)->Outtextxy("   RED    ");
  194. setcolor(9);
  195. Record.GetRectangle(17)->Outtextxy("   BLUE   ");
  196. setcolor(10);
  197. Record.GetRectangle(23)->Outtextxy("  GREEN   ");
  198. setcolor(14);
  199. Record.GetRectangle(29)->Outtextxy("  YELLOW  ");
  200. }
  201. void InitGrid(void)
  202. {
  203. int number=0,circle=0;
  204. setcolor(11);
  205. outtextxy(130,150,"***** The FIFO Method of Memory Distribute *****");
  206. line(15,180,625,180);
  207. line(15,340,625,340);
  208. setcolor(13);
  209. for (circle=0;circle<50;circle++)
  210. {
  211. Graph.NewRectangle(number,110+circle*10,230,circle*10+120,240);
  212. number=number+1;
  213. }
  214. for (circle=0;circle<50;circle++)
  215. {
  216. Graph.NewRectangle(number,110+circle*10,300,circle*10+120,310);
  217. number=number+1;
  218. }
  219. setcolor(14);
  220. outtextxy(20,210,"Main Memory");
  221. outtextxy(20,280,"Hard Disk");
  222. }
  223. int Returncolor(int number)
  224. {
  225. if (number==1) return 12;
  226. if (number==2) return 9;
  227. if (number==4) return 10;
  228. if (number==8) return 14;
  229. else return 0;
  230. }
  231. void Allocation(void)
  232. {
  233. PCB NewNode;
  234. int color,circle;
  235. NewNode.SetSizeTs();
  236. if(HARDDISK[CurrentEIDD].GetSize()==0
  237. &&CurrentMMp+NewNode.GetSize()<=SIZE)
  238. {
  239. NewNode.SetID(CurrentMIDM);
  240. NewNode.SetMFlag();
  241. color=Returncolor(NewNode.GetSize());
  242. for (circle=CurrentMMp;circle<CurrentMMp+NewNode.GetSize();circle++)
  243. {
  244. Graph.GetRectangle(circle)->Fill(color);
  245. Screen[circle]=color;
  246. }
  247. MEMORY[CurrentMIDM]=NewNode;
  248. CurrentMIDM=CurrentMIDM+1;
  249. CurrentMMp=CurrentMMp+NewNode.GetSize();
  250. LeftSpace=LeftSpace-NewNode.GetSize();
  251. }
  252. else
  253. {
  254. NewNode.SetID(CurrentMIDD);
  255. NewNode.SetDFlag();
  256. color=Returncolor(NewNode.GetSize());
  257. for (circle=CurrentMDp;circle<CurrentMDp+NewNode.GetSize();circle++)
  258. {
  259. Graph.GetRectangle(circle+SIZE)->Fill(color);
  260. Screen[circle+SIZE]=color;
  261. }
  262. HARDDISK[CurrentMIDD]=NewNode;
  263. CurrentMIDD=CurrentMIDD+1;
  264. CurrentMDp=CurrentMDp+NewNode.GetSize();
  265. LeftD=LeftD-NewNode.GetSize();
  266. }
  267. }
  268. void Running(void)
  269. {
  270. int circle=0;
  271. PCB TempNode;
  272. TempNode=MEMORY[CurrentEIDM];
  273. if(LeftSpace<50)
  274. {
  275. for (circle=0;circle<TempNode.GetSize();circle++)
  276. {
  277. delay(MAX);
  278. Graph.GetRectangle(circle)->Fill(0);
  279. Screen[circle]=0;
  280. }
  281. if (HARDDISK[CurrentEIDD].GetSize()==0)
  282. {
  283. CurrentMMp=CurrentMMp-TempNode.GetSize();
  284. LeftSpace=LeftSpace+TempNode.GetSize();
  285. Compact(1);
  286. }
  287. else Compact(2);
  288. CurrentEIDM=CurrentEIDM+1;
  289. }
  290. }
  291. void Compact(int number)
  292. {
  293. int i=0,circle=0,TempID,j;
  294. if (number==1)
  295. {
  296. while ((Screen[i]==0) && (i<SIZE)) i=i+1;
  297. if (i>0)
  298. {
  299. for (circle=0;circle<MAX-i;circle++)
  300. Screen[circle]=Screen[circle+i];
  301. for (circle=MAX-i;circle<MAX;circle++) Screen[circle]=0;
  302. for (circle=0;circle<MAX;circle++)
  303. Graph.GetRectangle(circle)->Fill(Screen[circle]);
  304. }
  305. }
  306. if (number==2)
  307. {
  308. while ((Screen[i]==0) && (i<SIZE)) i=i+1;
  309. if (i>0)
  310. {
  311. for (circle=0;circle<SIZE-i;circle++)
  312. Screen[circle]=Screen[circle+i];
  313. for (circle=SIZE-i;circle<SIZE;circle++) Screen[circle]=0;
  314. CurrentMMp=CurrentMMp-i;
  315. LeftSpace+=i;
  316. TempID=CurrentEIDD;
  317. while(HARDDISK[TempID].GetSize()<=LeftSpace&&CurrentMDp!=0)
  318. {
  319. for (circle=SIZE;circle<SIZE+HARDDISK[TempID].GetSize();
  320. circle++) Screen[circle]=0;
  321. CurrentMDp=CurrentMDp-HARDDISK[TempID].GetSize();
  322. for (circle=SIZE-LeftSpace;circle<
  323. SIZE-LeftSpace+HARDDISK[TempID].GetSize();circle++)
  324. Screen[circle]=Returncolor(HARDDISK[TempID].GetSize());
  325. CurrentMMp=CurrentMMp+HARDDISK[TempID].GetSize();
  326. MEMORY[CurrentMIDM]=HARDDISK[TempID];
  327. CurrentMIDM++;
  328. LeftSpace=LeftSpace-HARDDISK[TempID].GetSize();
  329. for (circle=SIZE;circle<SIZE+CurrentMDp;circle++)
  330. Screen[circle]=
  331. Screen[circle+HARDDISK[CurrentEIDD].GetSize()];
  332. for (circle=SIZE+CurrentMDp;circle<MAX;circle++)
  333. Screen[circle]=0;
  334. for (circle=0;circle<MAX;circle++)
  335. Graph.GetRectangle(circle)->Fill(Screen[circle]);
  336. LeftD=LeftD+HARDDISK[TempID].GetSize();
  337. CurrentEIDD++;
  338. TempID++;
  339. }
  340. }
  341. }
  342. }
  343. void Version()
  344. {
  345. setcolor(14);
  346. outtextxy(150,420," DESIGNED  By  NEWTRUMP  2001.01.01     ");
  347. outtextxy(150,440,"             Version 2.0                ");
  348. }