TestLockDlg.cpp
上传用户:jnsxzc
上传日期:2007-01-03
资源大小:25k
文件大小:7k
源码类别:

进程与线程

开发平台:

Visual C++

  1. // TestLockDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "TestLock.h"
  5. #include "TestLockDlg.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CAboutDlg dialog used for App About
  13. class CAboutDlg : public CDialog
  14. {
  15. public:
  16. CAboutDlg();
  17. // Dialog Data
  18. //{{AFX_DATA(CAboutDlg)
  19. enum { IDD = IDD_ABOUTBOX };
  20. //}}AFX_DATA
  21. // ClassWizard generated virtual function overrides
  22. //{{AFX_VIRTUAL(CAboutDlg)
  23. protected:
  24. virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  25. //}}AFX_VIRTUAL
  26. // Implementation
  27. protected:
  28. //{{AFX_MSG(CAboutDlg)
  29. //}}AFX_MSG
  30. DECLARE_MESSAGE_MAP()
  31. };
  32. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  33. {
  34. //{{AFX_DATA_INIT(CAboutDlg)
  35. //}}AFX_DATA_INIT
  36. }
  37. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  38. {
  39. CDialog::DoDataExchange(pDX);
  40. //{{AFX_DATA_MAP(CAboutDlg)
  41. //}}AFX_DATA_MAP
  42. }
  43. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  44. //{{AFX_MSG_MAP(CAboutDlg)
  45. // No message handlers
  46. //}}AFX_MSG_MAP
  47. END_MESSAGE_MAP()
  48. /////////////////////////////////////////////////////////////////////////////
  49. // CTestLockDlg dialog
  50. CTestLockDlg::CTestLockDlg(CWnd* pParent /*=NULL*/)
  51. : CDialog(CTestLockDlg::IDD, pParent)
  52. {
  53. //{{AFX_DATA_INIT(CTestLockDlg)
  54. m_nReaderThreadSelectionIndex = 0;
  55. m_nWriterThreadSelectionIndex = 0;
  56. //}}AFX_DATA_INIT
  57. // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  58. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  59. }
  60. void CTestLockDlg::DoDataExchange(CDataExchange* pDX)
  61. {
  62. CDialog::DoDataExchange(pDX);
  63. //{{AFX_DATA_MAP(CTestLockDlg)
  64. DDX_LBIndex(pDX, IDC_NUM_READER_THREADS, m_nReaderThreadSelectionIndex);
  65. DDX_LBIndex(pDX, IDC_NUM_WRITER_THREADS, m_nWriterThreadSelectionIndex);
  66. //}}AFX_DATA_MAP
  67. }
  68. BEGIN_MESSAGE_MAP(CTestLockDlg, CDialog)
  69. //{{AFX_MSG_MAP(CTestLockDlg)
  70. ON_WM_SYSCOMMAND()
  71. ON_WM_PAINT()
  72. ON_WM_QUERYDRAGICON()
  73. ON_BN_CLICKED(ID_EXIT, OnExit)
  74. ON_BN_CLICKED(ID_START, OnStart)
  75. ON_BN_CLICKED(ID_STOP, OnStop)
  76. ON_LBN_SELCHANGE(IDC_NUM_READER_THREADS, OnSelchangeNumReaderThreads)
  77. ON_LBN_SELCHANGE(IDC_NUM_WRITER_THREADS, OnSelchangeNumWriterThreads)
  78. //}}AFX_MSG_MAP
  79. END_MESSAGE_MAP()
  80. /////////////////////////////////////////////////////////////////////////////
  81. // CTestLockDlg message handlers
  82. BOOL CTestLockDlg::OnInitDialog()
  83. {
  84. CDialog::OnInitDialog();
  85. // Add "About..." menu item to system menu.
  86. // IDM_ABOUTBOX must be in the system command range.
  87. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  88. ASSERT(IDM_ABOUTBOX < 0xF000);
  89. CMenu* pSysMenu = GetSystemMenu(FALSE);
  90. if (pSysMenu != NULL)
  91. {
  92. CString strAboutMenu;
  93. strAboutMenu.LoadString(IDS_ABOUTBOX);
  94. if (!strAboutMenu.IsEmpty())
  95. {
  96. pSysMenu->AppendMenu(MF_SEPARATOR);
  97. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  98. }
  99. }
  100. // Set the icon for this dialog.  The framework does this automatically
  101. //  when the application's main window is not a dialog
  102. SetIcon(m_hIcon, TRUE); // Set big icon
  103. SetIcon(m_hIcon, FALSE); // Set small icon
  104. // TODO: Add extra initialization here
  105. for (int i = MAX_READER_THREADS; i > 0; i--)
  106. {
  107. m_pcThreadObjects[i] = NULL;
  108. CString szTemp;
  109. szTemp.Format("%d", i);
  110. int iRetVal = static_cast<CListBox*> (GetDlgItem(IDC_NUM_READER_THREADS))->AddString(szTemp);
  111. if (iRetVal == LB_ERR || iRetVal == LB_ERRSPACE)
  112. {
  113. AfxMessageBox("Error!! Adding String to List box -  Aborting");
  114. EndDialog(FALSE);
  115. }
  116. }
  117. for (int j = MAX_WRITER_THREADS; j > 0; j--)
  118. {
  119. m_pcThreadObjects[j + MAX_READER_THREADS] = NULL;
  120. CString szTemp;
  121. szTemp.Format("%d", j);
  122. int iRetVal = static_cast<CListBox*> (GetDlgItem(IDC_NUM_WRITER_THREADS))->AddString(szTemp);
  123. if (iRetVal == LB_ERR || iRetVal == LB_ERRSPACE)
  124. {
  125. AfxMessageBox("Error!! Adding String to List box -  Aborting");
  126. EndDialog(FALSE);
  127. }
  128. }
  129. m_bTestStarted = FALSE;
  130. m_pcLock = new CRWLock;
  131. EnableStartButton(FALSE);
  132. EnableStopButton(FALSE);
  133. return TRUE;  // return TRUE  unless you set the focus to a control
  134. }
  135. void CTestLockDlg::OnSysCommand(UINT nID, LPARAM lParam)
  136. {
  137. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  138. {
  139. CAboutDlg dlgAbout;
  140. dlgAbout.DoModal();
  141. }
  142. else if ((nID & 0xFFF0) == SC_CLOSE)
  143. {
  144. OnExit();
  145. }
  146. else
  147. {
  148. CDialog::OnSysCommand(nID, lParam);
  149. }
  150. }
  151. // If you add a minimize button to your dialog, you will need the code below
  152. //  to draw the icon.  For MFC applications using the document/view model,
  153. //  this is automatically done for you by the framework.
  154. void CTestLockDlg::OnPaint() 
  155. {
  156. if (IsIconic())
  157. {
  158. CPaintDC dc(this); // device context for painting
  159. SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  160. // Center icon in client rectangle
  161. int cxIcon = GetSystemMetrics(SM_CXICON);
  162. int cyIcon = GetSystemMetrics(SM_CYICON);
  163. CRect rect;
  164. GetClientRect(&rect);
  165. int x = (rect.Width() - cxIcon + 1) / 2;
  166. int y = (rect.Height() - cyIcon + 1) / 2;
  167. // Draw the icon
  168. dc.DrawIcon(x, y, m_hIcon);
  169. }
  170. else
  171. {
  172. CDialog::OnPaint();
  173. }
  174. }
  175. // The system calls this to obtain the cursor to display while the user drags
  176. //  the minimized window.
  177. HCURSOR CTestLockDlg::OnQueryDragIcon()
  178. {
  179. return (HCURSOR) m_hIcon;
  180. }
  181. void CTestLockDlg::EnableStartButton(bool bEnable)
  182. {
  183. GetDlgItem(ID_START)->EnableWindow(bEnable);
  184. }
  185. void CTestLockDlg::EnableStopButton(bool bEnable)
  186. {
  187. GetDlgItem(ID_STOP)->EnableWindow(bEnable);
  188. }
  189. void CTestLockDlg::OnExit() 
  190. {
  191. // TODO: Add your control notification handler code here
  192. OnStop();
  193. delete m_pcLock;
  194. EndDialog(ID_EXIT);
  195. }
  196. void CTestLockDlg::OnStart() 
  197. {
  198. // TODO: Add your control notification handler code here
  199. if(m_bTestStarted)
  200. {
  201. OnStop();
  202. }
  203. UpdateData(true);
  204. pThreadArgument pArg = new threadArgument;
  205. pArg->pListBox  = static_cast <CListBox *> (GetDlgItem(IDC_THREAD_OUTPUT));
  206. pArg->pRwLock   = m_pcLock;
  207. for (int i = 0; i < (MAX_READER_THREADS - m_nReaderThreadSelectionIndex); i++)
  208. {
  209. pArg->bReader = true;
  210. m_pcThreadObjects[i] = new CDerivedThread((void *)pArg);
  211. }
  212. for (int j = 0; j < (MAX_WRITER_THREADS - m_nWriterThreadSelectionIndex); j++)
  213. {
  214. pArg->bReader = false;
  215. m_pcThreadObjects[j + i] = new CDerivedThread((void *)pArg);
  216. }
  217. m_bTestStarted = TRUE;
  218. EnableStopButton(TRUE);
  219. }
  220. void CTestLockDlg::OnStop() 
  221. {
  222. // TODO: Add your control notification handler code here
  223. if ( !m_bTestStarted )
  224. {
  225. return;
  226. }
  227. for (int i = 0; i < (MAX_READER_THREADS - m_nReaderThreadSelectionIndex); i++)
  228. {
  229. delete m_pcThreadObjects[i];
  230. m_pcThreadObjects[i] = NULL;
  231. }
  232. for (int j = 0; j < (MAX_WRITER_THREADS - m_nWriterThreadSelectionIndex); j++)
  233. {
  234. delete m_pcThreadObjects[j + i];
  235. m_pcThreadObjects[j + i] = NULL;
  236. }
  237. m_bTestStarted = FALSE;
  238. }
  239. void CTestLockDlg::OnSelchangeNumReaderThreads() 
  240. {
  241. // TODO: Add your control notification handler code here
  242. CDataExchange dx(this, TRUE);
  243. DDX_Check(&dx, IDC_NUM_READER_THREADS, m_nReaderThreadSelectionIndex);
  244. }
  245. void CTestLockDlg::OnSelchangeNumWriterThreads()
  246. {
  247. // TODO: Add your control notification handler code here
  248. CDataExchange dx(this, TRUE);
  249. DDX_Check(&dx, IDC_NUM_WRITER_THREADS, m_nWriterThreadSelectionIndex);
  250. EnableStartButton(TRUE);
  251. }