MFC如何使线程

线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。在Unix System V及SunOS中也被称为轻量进程(lightweight processes),但轻量进程更多指内核线程(kernel thread),而把用户线程(user thread)称为线程。
线程是独立调度和分派的基本单位。线程可以为操作系统内核调度的内核线程,如Win32线程;由用户进程自行调度的用户线程,如Linux平台的POSIX Thread;或者由内核与用户进程,如Windows 7的线程,进行混合调度。
同一进程中的多条线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等。但同一进程中的多个线程有各自的调用栈(call stack),自己的寄存器环境(register context),自己的线程本地存储(thread-local storage)。
一个进程可以允许有多个线程,但是一个线程至少要有一个线程(主线程)。

线程和进程的关系、

一个软件运行起来就是一个进程,而线程是包含在进程之中单一顺序的控制流。一般一个线程占用一个内核CPU。

线程的创建

线程的创建一般都是全局函数或者类的静态函数,返回值的类型一般为UINT型,参数为没有类型的指针。

使用的函数

1、AfxBegainTreade()创建函数
调用这个函数以创建一个新的线程。AfxBeginThread的第一种形式创建了一个工作线程。第二种形式创建了一个用户界面线程。AfxBeginThread创建一个新的CWinThread对象,调用它的CreateThread函数以启动这个线程,并且返回这个线程的指针。整个过程都进行检查以保证如果创建失败,所有的对象都会被适当地释放。为了结束这个线程,可以在线程内调用AfxEndThread,或者从工作线程的控制函数内返回。

CWinThread* AfxBeginThread(
      AFX_THREADPROC pfnThreadProc,
      LPVOID pParam,
      int nPriority = THREAD_PRIORITY_NORMAL,
      UINT nStackSize = 0,
      DWORD dwCreateFlags = 0,
      LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL
     );
CWinThread* AfxBeginThread(
      CRuntimeClass* pThreadClass,
      int nPriority = THREAD_PRIORITY_NORMAL,
      UINT nStackSize = 0,
      DWORD dwCreateFlags = 0,
      LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL
     );

参数:

  • pfnThreadProc 指向工作线程的控制函数。不能是NULL。这个函数必须按下面的方式定义:
  • UINT MyControllingFunction( LPVOID pParam ); pThreadClass 从CWinThread继承的对象的RUNTIME_CLASS。 pParam 将要传送给控制函数的参数,如pfnThreadProc中定义的函数参数所示。
  • nPriority 设定的线程的优先级。如果为0,则使用与创建它线程相同的优先级。在《Win32程序员参考》的“SetThreadPriority”中有可用的优先级的完整列表和描述。
  • nStackSize 指定新线程使用的栈的以字节为单位的大小。如果为0,则缺省的栈大小与创建它的线程的栈大小相同。
  • dwCreateFlags 指定控制线程的创建过程的附加标志。这个标志可以是两个值之一:
CREATE_SUSPENDED经过一个延迟后启动这个线程。这个线程将在调用ResumeThread 以后才会启动。
0创建后立即启动这个线程。
  • lpSecurityAttrs 指向一个SECURITY_ATTRIBUTES结构,它指定了线程的安全特性。如果为空,将使用与创建它的线程相同的安全特性。如果需要获得有关这个结构的详细信息,请参阅《Win32程序员参考手册》。
  • 返回值:指向新创建的线程对象的指针。

2、SuspendThread()暂停函数

DWORD SuspendThread( );

增加当前线程的挂起计数。如果线程的挂起计数大于零,则该线程将不被执行。线程可以通过调用ResumeThread成员函数恢复执行。

返回值:
如果成功,则返回线程原来的挂起计数值;否则返回0xFFFFFFFF。

3、ResumeThread()继续函数
DWORD ResumeThread( );

说明:
调用这个函数以使被SuspendThread成员函数所挂起的线程恢复执行,或者使用CREATE_SUSPENDED标志创建的线程恢复执行。当前线程的挂起计数被减小1。如果挂起计数被减小到0,线程将恢复执行;否则线程继续被挂起。

返回值:
如果成功,则返回线程的原挂起计数值;否则返回0xFFFFFFFF。如果返回值为零,则表示当前线程没有被挂起。如果返回值为1,线程被挂起,但是即将重新启动。任何大于1的返回值都表明线程将继续挂起。

例程:

1、创建线程

void C线程Dlg::OnBnClickedRunning()
{
	// TODO:  在此添加控件通知处理程序代码
	if (g_xxxThread == NULL)
	{
		g_xxxThread = AfxBeginThread(DemoA, NULL);
		g_bRunning = true;
	}
	else
	{
		AfxMessageBox(_T("线程已经启动"));
	}
	
}

2、线程控制函数

UINT DemoA(LPVOID pParam)
{
	
	for (int i = 0; i < 100; i++)
	{
		if (!g_bRunning)
			break;
		::SetDlgItemInt(AfxGetApp()->m_pMainWnd->m_hWnd, IDC_EDIT, i, false);
		Sleep(1000);
	}
	g_bRunning = false;
	g_xxxThread = NULL;
	return 0;
}

3、停止线程

void C线程Dlg::OnBnClickedSuspend()
{
	// TODO:  在此添加控件通知处理程序代码
	if (g_xxxThread == NULL)
	{
		AfxMessageBox(_T("线程已经关闭"));
	}
	else
	{
		
		g_xxxThread->SuspendThread();
	}
	
}

4、继续线程

void C线程Dlg::OnBnClickedResume()
{
	// TODO:  在此添加控件通知处理程序代码
	if (g_xxxThread == NULL)
	{
		AfxMessageBox(_T("线程已经关闭"));
	}
	else
	{
		g_xxxThread->ResumeThread();
	}
	
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值