现在的位置: 首页 > 综合 > 正文

WINDOWS下的多线程编程

2013年06月21日 ⁄ 综合 ⁄ 共 2046字 ⁄ 字号 评论关闭

WINDOWS下的多线程编程可以说是一个很深入的话题。有的人说,是否掌握多线程,是程序高手与一业余的区别!今天终于把想了很久的一本书从图书馆请了回来,名:《WINDOWS环境中的多线程实现》也是一个写自己的经验的一本书,我觉得自己很适合看这种书,但是,又不太喜欢其中的例程,总觉得本来可以看简单的东西,他非要搞点风马牛不相干的东西过来,使多线程的主体地位反而被充淡了。所以,结合他的思想,再看了看MSDN,我自己改造了一下,虽然简单,但是可以很容易理解,而且可以很快的应用到自己的程序设计中去,我觉得单纯的讲多线程是没有什么力量的,非得在实际应用中才能体会到它的好处和麻烦。比方说用在网络的SOCKET编程中。闲话不扯,下面我先来说一些基本概念:
一:什么是进程,线程:

“进程”是应用程序的执行实例。例如,双击“记事本”图标时,将启动运行“记事本”的进程。

“线程”是进程内的执行路径。启动“记事本”时,操作系统创建进程并开始执行该进程的主线程。此线程终止时,进程也终止。启动代码以函数地址的形式将此主线程提供给操作系统。通常是所提供的 main 函数或 WinMain 函数的地址。

但是你也可以在主线程下创建子(其它)线程,为了完成一些后台的处理工作。要处理后台或维护任务但又不想让用户等待完成这些任务时,您可能希望进行此操作。MFC中所有线程都由CWndThread来表示,但是在大多数情况下,我们不必显式的创建这些对象,而可以用AfxBeginTread函数来创建一个线程;它的定义如下:

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 
);

MFC中线程可以分为两种,
一:一个是用户界面线程,主要用来完成与用户输入有关的工作和响应用户事件。为了实现这一功能,往往会有一个叫做消息泵的机制,例如:WinApp就是用户界面线程对象的一个实例,做为主线程用来处理用户消息。
二:另一个是辅助线程或者称做为工作线程。它主要是为了完成一些不需要用户输入的操作。
下面我通过一个例子来说明一个工作线程是如何创建的。
1:建立MFC工程,带文档/视图结构。然后在菜单中加入两项,一个代表多线程,一个代表单线程;
2:建立如下的类结构:

3:OnMThead()中创建子线程

void CWorkThreadView::OnMThead() 
{
    
// TODO: Add your command handler code here
    pThread = AfxBeginThread( Calculate, this );
    AfxMessageBox(
"哈哈,我是多线程中的主线程,你会看到我的子线程和我一起出来呢!");
    pSubThread 
= AfxBeginThread( SubThread, this );
    
}

4:上面的SubThread是另一个进程的处理函数

UINT SubThread( LPVOID pParam )
{
    CWorkThreadView 
*pView = (CWorkThreadView*)pParam;
    pView
->PostMessage(WM_SUBTHREADMSG,NULL,0);
    
return 0;
}

5:而在CWorkThreadView类中处理WM_SUBTHREADMSG消息的函数是:DealSubThreadMsg

void CWorkThreadView::DealSubThreadMsg( WPARAM wParam, LPARAM lParam )
{
    AfxMessageBox(
"呵呵,一个子线程向我发了消息了!");
}

6:下面,大家就应该猜出运行结果了吧,是不是很简单啊。呵呵,现在总结一下如何创建工作线程:
* 启动进程 AfxBeginThread
* 实现控制函数

这里只是一个简单的创建工作线程的方法,可以说只是个入门,多线程的精华并不在这里,而是在后来的线程通信,互斥访问,信号量等细节,所以,多线程!我才刚刚上路呢!

抱歉!评论已关闭.