Advertisement
Guest User

Untitled

a guest
Nov 23rd, 2017
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.82 KB | None | 0 0
  1. // Okno.cpp : implementation file
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include "lab3.h"
  6. #include "Okno.h"
  7. #include ".\okno.h"
  8.  
  9. #ifdef _DEBUG
  10. #define new DEBUG_NEW
  11. #endif
  12.  
  13. //TODO: Deklaracje zmiennych globalnych
  14.  
  15. int przerwij;
  16. CString wynik;
  17. int jestWynik;
  18. int czaspracy[5];
  19. int liczbawatkow;
  20. CCriticalSection syn;
  21. CEvent syn2;
  22.  
  23.  
  24. #define WM_WIADOMOSC (WM_USER+100)
  25.  
  26. // CAboutDlg dialog used for App About
  27.  
  28. class CAboutDlg : public CDialog
  29. {
  30. public:
  31. CAboutDlg();
  32.  
  33. // Dialog Data
  34. enum { IDD = IDD_ABOUTBOX };
  35.  
  36. protected:
  37. virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
  38.  
  39. // Implementation
  40. protected:
  41. DECLARE_MESSAGE_MAP()
  42. };
  43.  
  44. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  45. {
  46. }
  47.  
  48. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  49. {
  50. CDialog::DoDataExchange(pDX);
  51. }
  52.  
  53. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  54. END_MESSAGE_MAP()
  55.  
  56.  
  57. // COkno dialog
  58.  
  59.  
  60.  
  61. COkno::COkno(CWnd* pParent /*=NULL*/)
  62. : CDialog(COkno::IDD, pParent)
  63. {
  64. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  65. }
  66.  
  67. void COkno::DoDataExchange(CDataExchange* pDX)
  68. {
  69. CDialog::DoDataExchange(pDX);
  70. DDX_Control(pDX, IDC_EKRAN, m_ekran);
  71. DDX_Control(pDX, IDC_W1, m_w1);
  72. DDX_Control(pDX, IDC_W2, m_w2);
  73. DDX_Control(pDX, IDC_W3, m_w3);
  74. DDX_Control(pDX, IDC_W4, m_w4);
  75. DDX_Control(pDX, IDC_W5, m_w5);
  76. DDX_Control(pDX, IDC_URUCHOM, m_uruchom);
  77. DDX_Control(pDX, IDC_PRZERWIJ, m_przerwij);
  78. DDX_Control(pDX, IDC_KONIEC, m_koniec);
  79. }
  80.  
  81. BEGIN_MESSAGE_MAP(COkno, CDialog)
  82. ON_WM_SYSCOMMAND()
  83. ON_WM_PAINT()
  84. ON_WM_QUERYDRAGICON()
  85. //}}AFX_MSG_MAP
  86. ON_MESSAGE(WM_WIADOMOSC, OnWiadomosc)
  87. ON_BN_CLICKED(IDC_URUCHOM, OnBnClickedUruchom)
  88. ON_WM_TIMER()
  89. ON_BN_CLICKED(IDC_PRZERWIJ, OnBnClickedPrzerwij)
  90. ON_BN_CLICKED(IDC_KONIEC, OnBnClickedKoniec)
  91. ON_WM_DESTROY()
  92. ON_EN_CHANGE(IDC_EKRAN, OnEnChangeEkran)
  93.  
  94. END_MESSAGE_MAP()
  95.  
  96.  
  97. // COkno message handlers
  98.  
  99. BOOL COkno::OnInitDialog()
  100. {
  101. CDialog::OnInitDialog();
  102.  
  103. // Add "About..." menu item to system menu.
  104.  
  105. // IDM_ABOUTBOX must be in the system command range.
  106. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  107. ASSERT(IDM_ABOUTBOX < 0xF000);
  108.  
  109. CMenu* pSysMenu = GetSystemMenu(FALSE);
  110. if (pSysMenu != NULL)
  111. {
  112. CString strAboutMenu;
  113. strAboutMenu.LoadString(IDS_ABOUTBOX);
  114. if (!strAboutMenu.IsEmpty())
  115. {
  116. pSysMenu->AppendMenu(MF_SEPARATOR);
  117. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  118. }
  119. }
  120.  
  121. // Set the icon for this dialog. The framework does this automatically
  122. // when the application's main window is not a dialog
  123. SetIcon(m_hIcon, TRUE); // Set big icon
  124. SetIcon(m_hIcon, FALSE); // Set small icon
  125.  
  126. // Add extra initialization here
  127. srand((unsigned )time(0));
  128. SetTimer(1,4000,0);
  129.  
  130.  
  131. return TRUE; // return TRUE unless you set the focus to a control
  132. }
  133.  
  134. void COkno::OnSysCommand(UINT nID, LPARAM lParam)
  135. {
  136. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  137. {
  138. CAboutDlg dlgAbout;
  139. dlgAbout.DoModal();
  140. }
  141. else
  142. {
  143. CDialog::OnSysCommand(nID, lParam);
  144. }
  145. }
  146.  
  147. // If you add a minimize button to your dialog, you will need the code below
  148. // to draw the icon. For MFC applications using the document/view model,
  149. // this is automatically done for you by the framework.
  150.  
  151. void COkno::OnPaint()
  152. {
  153. if (IsIconic())
  154. {
  155. CPaintDC dc(this); // device context for painting
  156.  
  157. SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
  158.  
  159. // Center icon in client rectangle
  160. int cxIcon = GetSystemMetrics(SM_CXICON);
  161. int cyIcon = GetSystemMetrics(SM_CYICON);
  162. CRect rect;
  163. GetClientRect(&rect);
  164. int x = (rect.Width() - cxIcon + 1) / 2;
  165. int y = (rect.Height() - cyIcon + 1) / 2;
  166.  
  167. // Draw the icon
  168. dc.DrawIcon(x, y, m_hIcon);
  169. }
  170. else
  171. {
  172. CDialog::OnPaint();
  173. }
  174. }
  175.  
  176. // The system calls this function to obtain the cursor to display while the user drags
  177. // the minimized window.
  178. HCURSOR COkno::OnQueryDragIcon()
  179. {
  180. return static_cast<HCURSOR>(m_hIcon);
  181. }
  182.  
  183. UINT COkno::WatekRoboczy(void * pParametr)
  184. {
  185. int i=(int)pParametr;
  186.  
  187. liczbawatkow++;
  188. do
  189. {
  190. if(przerwij==1)
  191. {
  192. break;
  193. }
  194. else
  195. {
  196. AfxGetMainWnd()->PostMessage(WM_WIADOMOSC,i,1);
  197. }
  198.  
  199. if(czaspracy[i]>0){
  200. Sleep(50);
  201. czaspracy[i]--;
  202. }
  203. else
  204. {
  205. AfxGetMainWnd()->PostMessage(WM_WIADOMOSC,i,2);
  206. syn.Lock();
  207. wynik.Format("Wynik: %d\r\n",i+1);
  208. jestWynik=1;
  209.  
  210. AfxGetMainWnd()->PostMessage(WM_WIADOMOSC,i,3);
  211. CSingleLock sl(&syn2);
  212. sl.Lock();
  213. syn2.Unlock();
  214.  
  215. break;
  216.  
  217. }
  218. }
  219. while(1);
  220. liczbawatkow--;
  221. AfxGetMainWnd()->PostMessage(WM_WIADOMOSC,i,4);
  222. jestWynik=1;
  223.  
  224. AfxGetMainWnd()->PostMessage(WM_WIADOMOSC,i,2);
  225. //syn.Lock();
  226. wynik.Format("Wynik: %d\r\n",i+1);
  227. jestWynik=1;
  228. AfxGetMainWnd()->PostMessage(WM_WIADOMOSC,i,1);
  229. //syn.Lock();
  230. wynik.Format("Wynik: %d\r\n",i+1);
  231. jestWynik=1;
  232. AfxGetMainWnd()->PostMessage(WM_WIADOMOSC,i,3);
  233. //syn.Lock();
  234. wynik.Format("Wynik: %d\r\n",i+1);
  235. jestWynik=1;
  236. return 0;
  237. }
  238. void COkno::OnBnClickedUruchom()
  239. {
  240. m_uruchom.EnableWindow(FALSE);
  241. m_przerwij.EnableWindow();
  242. przerwij=0;
  243. for (int i=0;i<5;i++)
  244. {
  245. czaspracy[i]=10+(30*rand())/RAND_MAX;
  246. AfxBeginThread(WatekRoboczy,(void *)i);
  247. }
  248. }
  249.  
  250. afx_msg LRESULT COkno::OnWiadomosc(WPARAM n, LPARAM m)
  251. {
  252. static char* w[4] =
  253. {"Oblicza...", "Czeka na ekran...", "Wyswietla wynik...", "Zakonczyl prace"};
  254. CString tmp;
  255. tmp = w[m-1];
  256. if((m-1)==0)
  257. {
  258. tmp.AppendFormat("Pozostalyczas: %d",czaspracy[n]);
  259. }
  260.  
  261. switch (n) {
  262. case 0: m_w1.SetWindowText(tmp);
  263. break;
  264. case 1: m_w2.SetWindowText(tmp);
  265. break;
  266. case 2: m_w3.SetWindowText(tmp);
  267. break;
  268. case 3: m_w4.SetWindowText(tmp);
  269. break;
  270. case 4: m_w5.SetWindowText(tmp);
  271. break;
  272. }
  273. return 0;
  274. }
  275. ////////////////////////////////////////////////////////////////////////////////////////////////////
  276. void COkno::OnTimer(UINT nIDEvent)
  277. {
  278. CString s;
  279. char buffer[1024];
  280. CDialog::OnTimer(nIDEvent);
  281. if(!jestWynik)
  282. {
  283. return;
  284. }
  285. else
  286. {
  287. CString t;
  288. m_ekran.GetWindowText(s);
  289. /*TODO: dodanie zmiennej z wynikiem do s */;
  290. s=s+wynik;
  291. m_ekran.SetWindowText(s);
  292. /*TODO: Ustawienie stanu odpowiedniego obiektu synchronizacji*/
  293. wynik="";
  294. if(wynik.GetLength()==0)
  295. {
  296. syn2.Unlock();
  297. }
  298. }
  299. }
  300. /////////////////////////////////////////////////////////////////////////////////////////////////////
  301. void COkno::OnBnClickedPrzerwij()
  302. {
  303. /*TODO: Ustawienie zmiennej informujacej o wcisnieciu "Przerwij"*/
  304. przerwij=1;
  305. m_uruchom.EnableWindow();
  306. m_przerwij.EnableWindow(FALSE);
  307.  
  308. OnTimer(1);
  309. do
  310. {
  311. OnTimer(1);
  312. }while(liczbawatkow>1);
  313. }
  314.  
  315. void COkno::OnBnClickedKoniec()
  316. {
  317. EndDialog(1);
  318. }
  319.  
  320. void COkno::OnDestroy()
  321. {
  322. KillTimer(1);
  323. OnBnClickedPrzerwij();
  324. CDialog::OnDestroy();
  325. }
  326.  
  327. void COkno::OnEnChangeEkran()
  328. {
  329. CString s;
  330. m_ekran.SetWindowText(s);
  331. wynik="";
  332. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement