VC2012 多线程

来源:互联网 发布:上海博物馆淘宝 编辑:程序博客网 时间:2024/03/29 23:31

工作者线程和用户界面线程

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

 所以不要在工作者线程中做用户事件响应也不要做其他界面操作 .

二  CreateThread()

HANDLE WINAPI CreateThread(              _In_opt_  LPSECURITY_ATTRIBUTES lpThreadAttributes, //子进程能否继承这个线程句柄              _In_      SIZE_T dwStackSize,                       //线程栈大小                 _In_      LPTHREAD_START_ROUTINE lpStartAddress,    //线程函数名称              _In_opt_  LPVOID lpParameter,                       //传入线程函数的参数              _In_      DWORD dwCreationFlags,       //0:立即启用新线程, CREATE_SUSPENDED:挂起              _Out_opt_ LPDWORD lpThreadId);                      //保存新线程的ID号 DWORD WINAPI MyThreadFunction( LPVOID lpParam );HANDLE  hThreadArray;DWORD   dwThreadIdArray;hThreadArray = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)MyThreadFunction, "param",0,&dwThreadIdArray);  if (hThreadArray[i] == NULL)        {           ExitProcess(3);        }// Wait until all threads have terminated.   WaitForMultipleObjects(MAX_THREADS, hThreadArray, TRUE, INFINITE);TerminateThread(hThreadArray,0);CloseHandle(hThreadArray);hThreadArray = NULL;

 

注意:  线程函数必须是全局函数或者静态函数, 否则会提示类型转换错误.

          WaitForMultipleObjects()等待线程结束

 

三 退出

1 线程结束//调用析构函数,释放线程栈,线程内核对象减一  .总之很完美

2 ExitThread(dwExitCode) 线程中调用此函数退出

3 TerminateThread(hThreadArray); 线程调用此函数结束其他线程 ,用TerminateThread结束的线程系统会保留线程栈以便其他线程访问.

 

四 互斥对象

使用互斥对象保证只有一个进程运行

//Check and create mutex.m_hMutex = CreateMutex(NULL, FALSE, UTILITY_NAME);//互斥对象用来多线程访问共享资源if(m_hMutex==NULL){MessageBox(_T("創建互斥對象失敗!!"),UTILITY_NAME,MB_OK|MB_ICONINFORMATION);CloseHandle(m_hMutex);EndDialog(1);return FALSE;}if(GetLastError() == ERROR_ALREADY_EXISTS){MessageBox(TEXT("本程序已經在運行!!"),UTILITY_NAME,MB_OK|MB_ICONINFORMATION);CloseHandle(m_hMutex);EndDialog(1);return FALSE;}