MFC多线程之购票系统

MFC线程--购票系统演示

在大学操作系统课程中,进程和线程是一个经常谈到的话题,而购票系统是关于线程的一个经典的例子,它涉及到创建线程,线程同步等。

废话不多说,下面就用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
);

第一个参数 pfunThreadProc,表示线程的入口函数地址,函数的原形应该如同:UINT

MyControllingFunction( LPVOID pParam );

第二个参数 pParam,表示传递给线程的参数。

第三个参数 nPriority,表明线程的优先级,默认的优先级别 THREAD_PRIORITY_NORMAL,

如果为 0,则与创建该线程的线程相同。该参数有以下几种级别,下面是从高到低排序的:

THREAD_PRIORITY_TIME_CRITICAL

THREAD_PRIORITY_HIGHEST

THREAD_PRIORITY_ABOVE_NORMAL

THREAD_PRIORITY_NORMAL

THREAD_PRIORITY_BELOW_NORMAL

THREAD_PRIORITY_LOWEST

HREAD_PRIORITY_IDLE

第四个参数 nStackSize,表示线程的栈大小,如果为 0 表示使用系统默认值。

第五个参数 dwCreateFlags,表示创建线程时的标记,若该参数为 CREATE_SUSPENDED

表示线程创建后呈挂起状态;如果为 0,表示该线程一建立就立即运行。

第六个参数 lpSecurityAttrs,表示安全属性,该参数一般为 NULL。

该函数调用成功的返回值是 CWinThread 类的指针,可以通过它实现对线程的控制。在

线程函数返回时线程将被结束,在线程内部可以利用 void AfxEndThread( UINT nExitCode );

结束线程,nExitCode 为退出码。

工作者线程一旦启动,就开始执行控制函数,线程结束,控制函数也就结束了。线程控

制函数的原形如下:

UINT MyControllingFunction(LPVOID pParam);

3.编译--链接--运行。结果如下:

**完整源码下载:http://download.csdn.net/detail/u010233287/8202207





时间: 2025-01-02 14:34:50

MFC多线程之购票系统的相关文章

深入浅出MFC——MFC多线程程序设计(七)

1. 从操作系统层面看线程——三个观念:模块(MDB).进程(PDB).线程(TDB) 2. “执行事实”发生在线程身上,而不在进程身上.也就是说,CPU调度单位是线程而非进程.调度器据以排序的,是每个线程的优先级. 3. MDB.PDB和TDB: 注:Thread Context:线程环境,也即构成线程的“后台”. 4. 从程序设计层面看线程——Worker Threads 和 UI Threads: 5. MFC多线程程序设计——探索CWinThread. 6. Worker Thread:

MFC多线程内存泄漏问题&amp;amp;解决方法

在用visual studio进行界面编程时(如MFC),前台UI我们能够通过MFC的消息循环机制实现.而对于后台的数据处理.我们可能会用到多线程来处理. 那么对于大多数人(尤其是我这样的菜鸟),一个比較快捷的方法便是选择MFC多线程:AfxBeginThread或者CreateThread来进建立多线程.当一两个线程还是能够得.当有3个或者3个以上的线程出现时,极可能出现内存泄漏.原因分析例如以下: CWinThread的多线程不安全性: 由于 CWinThread 会调用_beginthre

MFC多线程内存泄漏问题&amp;解决方法

在用visual studio进行界面编程时(如MFC),前台UI我们可以通过MFC的消息循环机制实现.而对于后台的数据处理,我们可能会用到多线程来处理.那么对于大多数人(尤其是我这种菜鸟),一个比较快捷的方法便是选择MFC多线程:AfxBeginThread或者CreateThread来进建立多线程.当一两个线程还是可以得,当有3个或者3个以上的线程出现时,极可能出现内存泄漏.原因分析如下: CWinThread的多线程不安全性: 因为 CWinThread 会调用_beginthreadex

OC-《购票系统》

来个命令行的购票系统 --1-- 需求分析 1.1 分析 1.2 功能分析 1.3 流程分析 --2-- 原型展示 2.1 界面原型 --3-- 系统设计 3.1 类设计 3.2 框架模块设计 --4-- 实现 4.1 代码实现 [写在开头:] 『如今使用移动设备购物.买票都已经是一种基本的生活方式了,我们习惯了使用手机来完成生活中的很多事.没有使用UI框架,所以还是采用命令行交互的方式,只是语言使用的是OC了』 --1-- 需求分析 1.1 分析 进入电影院我们首先看到的是各种影讯,然后根据影

MFC多线程

MFC多线程 分类: C/C++2013-05-31 23:33 256人阅读 评论(0) 收藏 举报 MFC多线程 (一) MFC对多线程编程的支持             MFC中有两类线程,分别称之为工作者线程和用户界面线程.二者的主要区别在于工作者线程没有消息循环,而用户界面线程有自己的消息队列和消息循环.         工作者线程没有消息机制,通常用来执行后台计算和维护任务,如冗长的计算过程,打印机的后台打印等.用户界面线程一般用于处理独立于其他线程执行之外 的用户输入,响应用户及系

MFC多线程各种线程用法 .

http://blog.csdn.net/qq61394323/article/details/9328301 一.问题的提出 编写一个耗时的单线程程序: 新建一个基于对话框的应用程序SingleThread,在主对话框IDD_SINGLETHREAD_DIALOG添加一个按钮,ID为 IDC_SLEEP_SIX_SECOND,标题为“延时6秒”,添加按钮的响应函数,代码如下: void CSingleThreadDlg::OnSleepSixSecond() { Sleep(6000); //

OC代码实现的购票系统

一.一个有关oc实现的购票系统 此次的购票系统主要是通过OC来编程的,下面我将把握的思路和大家分享. 1.思路. 我们直接来看我写的几张思路图吧.上面都写的很明白,下面的主要思路就是大致的方向. #import <Foundation/Foundation.h> #import "Cinema.h" void buyMovieTicket(){ //调用 电影院的类的 buyTicket的方法 Cinema *cinema = [[Cinema alloc] initWit

黑马程序员——c语言学习心得—— 电影购票系统

黑马程序员——c语言学习心得——  电影购票系统 -------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 1,基础信息类 #import <Foundation/Foundation.h> #import "Cinema.h" void buyMovieTicket(){ //购买电影票 //调用 电影院的类的 buyTicket的方法 //                  [[Cinema alloc] init]; C

MultiThread(VS2013 MFC多线程-含源码-含个人逐步实现文档)

原文:http://download.csdn.net/download/jobfind/9559162 MultiThread(VS2013 MFC多线程-含源码-含个人逐步实现文档).rar