在大学操作系统课程中,进程和线程是一个经常谈到的话题,而购票系统是关于线程的一个经典的例子,它涉及到创建线程,线程同步等。
废话不多说,下面就用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