首页 > 其他分享 >多线程创建函数

多线程创建函数

时间:2023-11-21 11:23:46浏览次数:48  
标签:HANDLE 函数 CreateThread 创建 线程 DWORD 多线程

1、CreateThread()函数

   CreateThread是一种微软在Windows API中提供了建立新的线程的函数,该函数在主线程的基础上创建一个新线程。

         线程终止运行后,线程对象仍然在系统中,必须通过CloseHandle函数来关闭该线程对象。

1 HANDLE CreateThread(
2   LPSECURITY_ATTRIBUTES   lpThreadAttributes,
3   SIZE_T                  dwStackSize,
4   LPTHREAD_START_ROUTINE  lpStartAddress,
5   __drv_aliasesMem LPVOID lpParameter,
6   DWORD                   dwCreationFlags,
7   LPDWORD                 lpThreadId
8 );

// 第一个参数 lpThreadAttributes 表示线程内核对象的安全属性,一般传入NULL表示使用默认设置。
// 第二个参数 dwStackSize 表示线程栈空间大小。传入0表示使用默认大小(1MB)。
// 第三个参数 lpStartAddress 表示新线程所执行的线程函数地址,多个线程可以使用同一个函数地址。
// 第四个参数 lpParameter 是传给线程函数的参数.
// 第五个参数 dwCreationFlags 指定额外的标志来控制线程的创建,为0表示线程创建之后立即就可以进行调度,如果为CREATE_SUSPENDED则表示线程创建后暂停运行,
这样它就无法调度,直到调用ResumeThread()。
// 第六个参数 lpThreadId 将返回线程的ID号,传入NULL表示不需要返回该线程ID号
 1 #include <Windows.h>
 2 #include <stdio.h>
 3 #include <process.h>
 4 
 5 //HANDLE
 6 //WINAPI
 7 //CreateThread(
 8 //    _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,
 9 //    _In_ SIZE_T dwStackSize,
10 //    _In_ LPTHREAD_START_ROUTINE lpStartAddress,
11 //    _In_opt_ __drv_aliasesMem LPVOID lpParameter,
12 //    _In_ DWORD dwCreationFlags,
13 //    _Out_opt_ LPDWORD lpThreadId
14 //);
15 DWORD WINAPI ThreadFun(LPVOID p) {
16     int a = *(int*)p;
17 
18     printf("我是子线程,PID = %d,iMym = %d\n", GetCurrentThreadId(), a);
19     
20     return 0;
21 }
22 
23 
24 int main() {
25     HANDLE ZThread;
26     DWORD dwThreadID;
27     int a = 100;
28     ZThread = CreateThread(NULL, 0, &ThreadFun, &a, 0, &dwThreadID);
29     
30 }

2、主要的函数

 1 CreateThread() 创建一个线程
 2 
 3 ExitThread() 正常结束一个线程的执行
 4 
 5 TerminateThead() 强制终止一个线程的执行
 6 
 7 ResumeThread() 重启一个线程
 8 
 9 SuspendThread() 挂起一个线程
10 
11 GetExiCodeThread() 得到一个线程的退出码
12 
13 GetThreadPriority() 得到一个线程的优先级
14 
15 SetThreadPriority() 设置一个线程的优先级
16 
17 CloseHandle() 关闭一个线程的句柄
18 
19 CreateRemoteThread() 再另一个进程中创建一个新线程
20 
21 PostThreadMessage() 发送一条消息给指定的线程
22 
23 GetCurrentThread() 得到当前的线程句柄
24 
25 GetCurrentThreadId() 得到当前线程的ID
26 
27 GetThreadId() 得到指定线程的ID
28 
29 WaitForSingleObject() 等待单个对象
30 
31 WaitForMultipleObjects() 等待多个对象

 1 static DWORD WINAPI myThreadFun(LPVOID lp);
 2 /***************1 CreateThread *******************/
 3     HANDLE m_myCreateThread = CreateThread(NULL,//线程安全属性
 4         0,//堆栈大小
 5         CCWTestThreadDlg::myThreadFun,//线程函数
 6         0,//线程参数
 7         0,//线程创建属性
 8         NULL);//线程ID
 9 
10     if (m_myCreateThread == INVALID_HANDLE_VALUE)
11     {
12         AfxMessageBox(L"INVALID_HANDLE_VALUE ");
13         return;
14     }
15     //设置线程优先级
16     SetThreadPriority(m_myCreateThread, THREAD_PRIORITY_ABOVE_NORMAL);
17     ResumeThread(m_myCreateThread);
18     //关闭线程
19     CloseHandle(m_myCreateThread);
20 
21 DWORD WINAPI CCWTestThreadDlg::myThreadFun(LPVOID lp)
22 {
23     while (true)
24     {
25     }
26 
27     return 0;
28 }

3、创建线程方式2:C++11 标准下的std::thread

 1 /***************4 std::thread *******************/
 2 void myC11ThreadFun();
 3     std::thread m_pthreadc11;
 4     m_pthreadc11 = std::thread(&CCWTestThreadDlg::myC11ThreadFun, this);
 5     //m_pthreadc11.join();
 6 
 7     //关闭线程
 8     if (m_pthreadc11.joinable())
 9     {
10         m_pthreadc11.detach();
11     }
12 void CCWTestThreadDlg::myC11ThreadFun()
13 {
14     while (true)
15     {
16         if (/*m_bStop*/)
17         {
18             break;
19         }
20     }
21 }

 

标签:HANDLE,函数,CreateThread,创建,线程,DWORD,多线程
From: https://www.cnblogs.com/Zhouce/p/17846186.html

相关文章

  • Linux中execl函数详解与日常应用!
    Linux中execl函数详解与日常应用execl是Linux系统中的一个系统调用,用于执行指定路径下的可执行文件。本文将详细介绍execl函数的使用方法和参数含义,并探讨其在日常开发中的常见应用场景和注意事项。1.execl函数概述execl函数属于Linux系统调用之一,其原型为:intexecl(constc......
  • php提前返回数据,后面代码继续执行封装函数
    /*中断并返回数据,后面程序继续执行,避免用户等待(immediate)*可用于返回值后,继续执行程序,但程序占得所以自由没有释放,一致占用,务必注意,最好给单独脚本执行*@paramstring|array$data字符串或数组,数组将被转换成json字符串*@paramintval$set_ti......
  • Keil(关闭 函数和关键字灰色下划线)
    例如: 原因是使用了keil自带的软件包,不使用用keil自带的库就没有了, 可以去Project==》Manage==》Run-TimeEnvironment把使用的软件包去掉勾选去掉勾选使用的CMSIS里的CORE,重新编译就可以了。......
  • 创建自定义日志筛选器
    Windows的事件查看器中的日志包含了很多信息,但是系统自带的筛选器只能筛选固定的字段和内容。有时候想根据某个事件中的用户名或者IP筛选的时候就没办法了。此时需要创建自定义筛选器来实现。首先找到希望筛选的日志,调整成详细的XML视图。  这里面就有我们需要用到的字段信......
  • 函数
    一,定义对代码块和功能的封装。形式为:def函数名():函数体return(会返回结果,可有可无)注意,return后面的函数会不再执行。关于返回值:如果return什么都不写或者⼲脆不写return.那么返回的就是None如果return后⾯写了⼀个值.则调⽤者可以接收⼀个......
  • 【爬虫】多线程下载文件
    importrequests   importjsonfromlxmlimportetreefromconcurrent.futuresimportThreadPoolExecutor     导入多线程所需要的库defmians(num):  url=f"http://www.1o1o.xyz/ctfarticle.asp?offset={num}"  domain="http://www.1o1o.xyz/"......
  • AutoCAD(VBA)引用excel函数
    AutoCAD(VBA)要引用excel可以把它定义成为一个对象,进行引用。'CAD调用EXCEL程序PublicFunctionexcelActive()AsObjectDimxlappAsObjectSetxlapp=GetObject(,"Excel.application")SetexcelActive=xlapp.ActiveSheetEndFunction......
  • 无涯教程-Ruby Class Case Study函数
    对于您的案Example研究,您将创建一个名为Customer的Ruby类,并将声明两个方法-display_details-此方法将显示客户的详细信息。total_no_of_customers-此方法将显示在系统中创建的客户总数。#!/usr/bin/rubyclassCustomer@@no_of_customers=0definitiali......
  • vue-ui创建项目
    1、命令提示行输入vueui2、他会跳出浏览器界面,之后选择路径创建3、选择条件命令提示框开始创建项目......
  • 如何在设置函数中访问 $vuetify 实例
    在Vue.js的设置函数中访问$vuetify实例可以通过以下步骤来实现:首先,在Vue组件的created钩子函数中访问$vuetify实例。created钩子函数在Vue实例创建之后立即调用。<script>exportdefault{created(){this.$nextTick(()=>{console.log(this.$vuetif......