C++11、MFC、Qt多线程整理

本周主要研究了多线程编程,包括WIN32 API的多线程编程,MFC框架多线程编程,QT框架中的多线程编程以及C++11中的基于Thread类的多线程。
(1)WIN 32 API编程
首先引入头文件<windows.h>,然后进行线程函数定义:DWORD WINAPI funThread (LPVOID  lpParameter); 调用CreateThread函数来启动线程,其中CreateThread有好多参数,参数如下:
CreateThread(
    _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,//线程安全属性,一般为null
    _In_ SIZE_T dwStackSize,//为线程分配的堆栈大小,一般设为0
    _In_ LPTHREAD_START_ROUTINE lpStartAddress,//线程启动函数,函数名,即funThread
    _In_opt_ __drv_aliasesMem LPVOID lpParameter,//为线程传递的参数
    _In_ DWORD dwCreationFlags,// 指定额外的标志来控制线程的创建,一般为0
    _Out_opt_ LPDWORD lpThreadId // 返回线程的ID,传为0表示不需要ID
    );
参数的传递:在主线程中传入type*类型参数给子线程,在子线程函数中进行接收,接收的形式为:type* n = (type*)lpParameter;
(2)MFC界面程序中的多线程
首先声明线程函数UINT MyThreadFunction( LPVOID pParam ); 然后在CWinThread* AFXAPI AfxBeginThread(
AFX_THREADPROC pfnThreadProc, //调用的线程函数地址(回调函数)
LPVOID pParam,//给线程函数传递的参数
int nPriority = THREAD_PRIORITY_NORMAL, //线程的优先级
UINT nStackSize = 0,//线程堆栈大小
DWORD dwCreateFlags = 0, //现成的标识
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL); //线程的安全属性
中进行创建线程。
MFC中常用实现线程同步的方法:
a互斥量:
  HANDLE hmutex;
Hmutex = CreateMutex(NULL,FALSE,NULL);

WaitForSingleObject(hmutex,INFINITE);
//需要同步的代码;
ReleaseMutex(hmutex);
b临界区:
  CRITCAL_SECTION section;
  InitializeCriticalSection(&section);

  EnterCriticalSection(&section);
  //需要同步的代码;
  LeaveCriticalSection(&section);
c事件对象:
  HANDLE hevent;
  Hevent=CreateEvent(NULL,FALSE,FALSE,NULL);
  SetEvent(hevent);

  WaitForSingleObject(hevent,INFINITE);
  ResetEvent(hevent);
//需要同步的代码
  SetEvent(hevent);
(3)QT多线程编程
方法1:继承Qthread类,然后重写run()方法。run()中的内容都会在子线程中执行。
方法2:定义工作线程Work类继承Qobject类,然后用MoveToThread()函数;定义一个Qthread qthread,然后Work *pWork;pWork = new Work(); pWork->moveToThread(&qthread);
(4)C++11中多线程的方法
  定义线程函数void funThread();
#include<Thread>头文件;
Thread t(funThread);
t.join()或者t.detach()来启动线程。
互斥量mutex类进行线程同步:
#include<mutex>   
mutex mu; 
mu.lock();
//需要同步的代码;
mu.unlock();
发布了9 篇原创文章 · 获赞 13 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qianlixiaomage/article/details/81987584