MFC之AfxbeginThread 线程 创建、挂起、释放、结束、退出

原创 2016年11月25日 12:12:44

MFC之AfxbeginThread创建线程

本文简单阐述了如何使用一个afxbeginthread创建一个线程(两种方法,使用默认设置,使用自主设置参数),以及一些如同,挂起,释放。边界锁等操作。

 

①.h文件添加声明

public:
CWinThread *m_pthread;
CWinThread *m_pthread2; 
static UINT __cdecl  hellothread(LPVOID lparam);
 //4.掐指算了一下。说是>vs 2005的编译器定义线程函数都需要添加两个宏,即UINT _cdecl
static UINT __cdecl testthread(LPVOID lparam);
CCriticalSection g_criticalsection; //边界锁,线程间同步用的。
BOOL tflag; 用作线程开关。



//1.线程同步有四种方式,边界锁、互斥量(CMutex)、信号灯、CEvent(事件)。不过对于CEvent和边界锁感觉能理解。
//http://blog.csdn.net/i_likechard/article/details/77531457    这个是介绍Cevent在线程中的用法的。
//2.边界锁CCriticalSection 和互斥量Cmutex很像,唯一的差别是,CMutex能够在进程间使用。
//3.网上也有通过UINT hellothread(LPVOID lparam);这种方式直接定义的;不过运行的时候会报错。



②.cpp 文件添加初始化及定义 

//特别注意,线程函数定义的代码位置一定要位于使用afxbeginthread()之前

在CthreadDlg::CpratiseDlg(CWnd*pParent):CDialogEx(CpratiseDlg::IDD,pParent)函数中,添加如下代码:将线程开关置为真。我的工程名为thread。

tflag=true;

以下为线程函数定义:

UINT __cdecl CthreadDlg::hellothread(LPVOID lparam) //线程1函数定义

{

//CthreadDlg *threadol = new CthreadDlg; 

//CthreadDlg *threadol=new CthreadDlg(); 

CthreadDlg *threadol=(CthreadDlg*) lparam;  

//以上3句代码均可实现将this指针传递给threadol对象。通过 "threadol->" 的方式,使得线程1中可以调用主线程的所有函数,全局变量,控件。

while (threadol->tflag) //通过线程开关控制线程1是否一直开启。

{  

//AfxMessageBox("hellothread"); 

 //threadol->m_static1.SetWindowTextA("第 1 个线程\n");  

threadol->g_criticalsection.Lock(); //边界锁锁定

// 同步锁中间可添加需要保护的操作代码,如操作txt文档读、看、写时等。

threadol->g_criticalsection.Unlock();//边界锁解除

}

return 0;

}

UINT __cdecl CthreadDlg::testthread( LPVOID lparam )//线程2函数定义

{

CthreadDlg *threadol = (CthreadDlg*)lparam;

 //线程2中写的比较简单。可以仿造线程1hellothread进行编写。

while(threadol->tflag)

//do something

threadol->g_criticalsection.Lock(); //边界锁锁定

// 同步锁中间可添加需要保护的操作代码,如操作txt文档读、看、写时等。

threadol->g_criticalsection.Unlock();//边界锁解除

return 0; 

}

③.cpp中OnInitDialog()函数中添加; //采用了两种方式来实现线程初始化,都是使用的afxBeginthread();

 tflag=TRUE;

 //将想成开关置为真。使得可以进行线程循环。

//m_pthread = AfxBeginThread(hellothread,(LPVOID)this);  

//第一个 线程1

m_pthread1 = AfxBeginThread(hellothread,this,THREAD_PRIORITY_NORMAL,0,0); 

//参数意义:(线程函数名,传递当前主对话框指针到线程函数中,普通级别,默认栈大小,自启动)

//第二个 线程2

m_pthread2=AfxBeginThread(testhread,this,THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED);

//参数意义:(函数名称,当前主对话框指针,优先级为“一般”的线程,默认栈大小,创建时挂起)

④线程的暂停、开始

//以下操作如同暂停、开始可使用某一button控件的点击事件中添加,实现对线程的控制。

SuspendThread(m_pthread2->m_hThread); //挂起第二个线程。“暂停”

ResumeThread(m_pthread2->m_hThread); //释放第二个线程。”播放“

//对于suspendthread和resumethread这两个函数,其中的参数为句柄。用afxbeginthread创建的线程返回值为一个指针。不过通过这个指针m_pthread2,可以找到m_hThread。

⑤查看线程

调用任务管理器,选择进程,单击查看,单击选择列,勾选“线程”。即可在任务管理器中查看。

⑥退出关闭一个线程(以下关闭代码可以添加到某button按钮下,如ok)

j较好的方式:线程函数的return 0;这样是最安全的。会释放所有资源。

例如:

void CthreadDlg::OnBnClickedOk()

{

// TODO: 在此添加控件通知处理程序代码 

tflag=FALSE;  

//线程开关置为假

WaitForSingleObject(m_pthread,100); 

WaitForSingleObject(m_pthread2,100);

g_criticalsection.Lock();

//file.Close();

g_criticalsection.Unlock();

CDialogEx::OnOK();   //关闭对话框

}

不正常的方式:exitthread();

例如:

DWORD exitcode2;

GetExitCodeThread(m_pthread2,&exitcode2);

ExitThread(exitcode2);   

 //运行了这句话之后,程序直接关闭了。由于我线程创建了两个。用这句话只能结束一个线程。所以这个东西不安全。不过对于只有一个线程的,在某种情况下使用也是很快。

//此处文档已完结,防止乱码引起的误会。

版权声明:本文为没有蛀牙lm的原创文章,未经没有蛀牙lm的允许不可转载。 http://blog.csdn.net/i_likechard

相关文章推荐

用户界面线程AfxBeginThread的使用

用户界面线程在运行时会有一个窗口界面和与其相对应的窗口函数,所以它可以通过响应消息来和用户进行交互。...
  • akof1314
  • akof1314
  • 2010年07月24日 23:42
  • 11065

C++多线程函数----AfxBeginThread

函数原型: CWinThread* AfxBeginThread( AFX_THREADPROC pfnThreadProc, LPVOIDpParam, intnPriority= THREAD_P...

MFC AfxBeginThread 多参数处理

1、  MFC中有两类线程,分别称之为工作者线程和用户界面线程。 二者的主要区别在于工作者线程没有消息循环,而用户界面线程有自己的消息队列和消息循环。 用户界面线程和工作者线程都是由AfxBegi...

关于mfc里afxbeginthread的一些感悟

      最近看一本书,书写的不错,很通俗易懂,我对其中的一些例子自己也做了练习,学到了不少.在我看线程这一块时,还是有不少感悟.        在看到afxbeginthread时,对这个方法蛮感...

AfxBeginThread的介绍/基本用法

AfxBeginThread    用户界面线程和工作者线程都是由AfxBeginThread创建的。现在,考察该函数:MFC提供了两个重载版的AfxBeginThread,一个用于用户界面线程,另一...

MFC下暂停、继续、结束AfxBeginThread开启的线程

MFC下暂停、继续、结束AfxBeginThread开启的线程   最近,由于论文的需求,要用到Windows下的多线程。考虑到界面用MFC写了,于是上网搜了下MFC下的多线程怎样搞,都说用AfxBe...

关于_beginthreadex与AfxbeginThread

比较CreateThread,_beginthreadex与AfxbeginThread的文章已经很多了,介绍的已经很详细,其中比较优秀的有: http://kulong0105.blog.163.c...
  • gogogo
  • gogogo
  • 2013年11月12日 15:57
  • 3252

比较CreateThread,_beginthread与AfxbeginThread

在Windows的多线程编程中,创建线程的函数主要有CreateThread,_beginthead(_beginthreadex)和AfxBeginThread,那么它们之间有什么联系与区别呢?当我...
  • joji_h
  • joji_h
  • 2014年08月01日 09:01
  • 3557

线程控制 - AfxBeginThread工作者线程的封装类

前言 工作者线程是MFC特有的概念 当使用AfxBeginThread做工作者线程时, 如果不封装线程类, 每次新增一条新的工作者线程, 就需要重复的添加工作者线程相关的控制数据和控制函数. 我...

用AfxBeginThread开启一个线程,怎么样去关闭这个线程?

一般不要主动去关闭,让线程自己返回即可,但是你一定要关闭,有几种方法可以根据自己的实际情况选择一种方式。   (1)在线程函数内部调用AfxEndThread关闭;  (2)或定义一个全局b...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MFC之AfxbeginThread 线程 创建、挂起、释放、结束、退出
举报原因:
原因补充:

(最多只允许输入30个字)