在大学操作系统课程中,进程和线程是一个经常谈到的话题,而购票系统是关于线程的一个经典的例子,它涉及到创建线程,线程同步等。
废话不多说,下面就用MFC来实现该购票系统。
1.新建一个MFC的对话框应用程序(工程名为 线程),按下图添加控件。
2.在“线程Dlg.h”文件中添加以下代码
//结构体,传给线程的参数 struct Ctrls { CProgressCtrl* progress; CStatic* text; }; //声明线程中执行的函数 UINT Buy(LPVOID lpParameter);
3.在“线程Dlg.cpp”文件中添加以下代码
CRITICAL_SECTION cs; //定义一个关键代码段对象 int total; //总票数 Ctrls ctrl1, ctrl2, ctrl3, ctrl4; UINT Buy(LPVOID lpParameter) { while (1) { EnterCriticalSection(&cs); if (total > 0) { Ctrls* c = (Ctrls*)lpParameter; c->progress->StepIt(); int num = c->progress->GetPos(); CString s; s.Format("%d", num); c->text->SetWindowText(s); total--; Sleep(50); LeaveCriticalSection(&cs); } else break; } return 0; } //按钮的点击事件 void CMyDlg::OnBuy() { // TODO: Add your control notification handler code here m_buy.EnableWindow(false); CString str; GetDlgItem(IDC_TOTAL)->GetWindowText(str); total = atoi(str); if (total <= 0 || total > 30000) MessageBox("请不要乱来!"); InitializeCriticalSection(&cs); m_pro1.SetRange32(0, total); m_pro1.SetStep(1); ctrl1.progress = &m_pro1; ctrl1.text = &m_num1; m_pro2.SetRange32(0, total); m_pro2.SetStep(1); ctrl2.progress = &m_pro2; ctrl2.text = &m_num2; m_pro3.SetRange32(0, total); m_pro3.SetStep(1); ctrl3.progress = &m_pro3; ctrl3.text = &m_num3; m_pro4.SetRange32(0, total); m_pro4.SetStep(1); ctrl4.progress = &m_pro4; ctrl4.text = &m_num4; AfxBeginThread(Buy, &ctrl1); AfxBeginThread(Buy, &ctrl2); AfxBeginThread(Buy, &ctrl3); AfxBeginThread(Buy, &ctrl4); }
--****用于创建工作者线程的函数如下:
CWinThread* AFXAPI AfxBeginThread( AFX_THREADPROC pfnThreadProc, LPVOID pParam, int nPriority, UINT nStackSize, DWORD dwCreateFlags, LPSECURITY_ATTRIBUTES lpSecurityAttrs );
UINT MyControllingFunction(LPVOID pParam);
原文地址:http://blog.csdn.net/liujian619/article/details/41525863