windows api多线程

线程是程序中一个单一的顺序控制流程。在单个程序中同时运行多个线程完成不同的工作,称为多线程。

以上来自百度百科。多线程技术会让程序变得更加强大,是单线程永远无法实现的。例如,在命令行中,用户正在响应getchar函数,而我需要在用户输入的同时将命令行标题改为现在的时间,这个效果是单线程永远不可能达到的。学习了本教程的内容,上面的例子就不难做到。

首先,认识API函数CreateThread:

HANDLE CreateThread(
  LPSECURITY_ATTRIBUTES lpThreadAttributes,
  DWORD dwStackSize,
  LPTHREAD_START_ROUTINE lpStartAddress,
  LPVOID lpParameter,
  DWORD dwCreationFlags,
  LPDWORD lpThreadId
);

参数及其复杂,但事实上在普通的编程中大多数参数基本不需要用到。直接看示例代码:

void Thread1()
{
  while(1)

  {

     system("title %time%");

  }
}

void main(int argc, char* argv[])
{
  HANDLE hThread;
  DWORD ThreadID;
  hThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Thread1,NULL,0,&ThreadID);
  getchar();
}

(如果提示getchar未定义,请加入stdio.h头文件)

是否实现了我们例子中想要的效果?让我们来分析一下代码。

  首先,在main函数中使用API函数CreateThread创建了一个线程,线程的内容就是执行Thread1函数(参数三),然后就到了getchar函数中等待用户的输入完成。而在此同时,刚刚创建的线程正在执行Thread1函数的内容,就是不断地将命令行标题设置为当前时间。于是,我们的效果便达成了。

  CreateThread返回的是线程的HANDLE,示例代码中是保存在hThread变量中。CreateThread会将第五个参数设置为线程的ID。线程的HANDLE和ID都是很重要的参数,对以后线程的其他操作有很重要的意义。

-----------------------------------------------------------------------分割线----------------------------------------------------------------------------------------------------------------------

CreateThread参数说明:

HANDLE CreateThread(
  LPSECURITY_ATTRIBUTES lpThreadAttributes,  // [in,可选] 句柄是否可被继承 ,为NULL则不可被继承                                                                                        
  DWORD dwStackSize,         //堆栈的初始大小,如为0系统自动分配
  LPTHREAD_START_ROUTINE lpStartAddress, //指向由线程执行的应用程序定义函数的指针。
  LPVOID lpParameter, //指向要传递给线程的变量的指针。
  DWORD dwCreationFlags, //控制线程创建的标志。为0该线程在创建后立即运行;其它可选标志看下文.
  LPDWORD lpThreadId  //指向接收线程标识符的变量的指针。如果此参数为 NULL,则不返回线程标识符。
);

DWORD dwCreationFlags //可选标志

  • 0 该线程在创建后立即运行。
  • CREATE_SUSPENDED(0x00000004)               该线程在挂起状态下创建,并且不会运行,直到 ResumeThread函数被调用。
  • STACK_SIZE_PARAM_IS_A_RESERVATION(0x00010000)   在所述dwStackSize参数指定堆栈的初始保留大小。如果未指定此标志,则dwStackSize指定提交大小。

-----------------------------------------------------------------------分割线----------------------------------------------------------------------------------------------------------------------

那么,再介绍几个API函数,这几个函数比较简单,请读者们自由测试:

DWORD SuspendThread(
HANDLE hThread
);

这个是挂起线程的API函数,用于暂停线程的执行。参数为创建线程时返回的线程HANDLE。

DWORD ResumeThread(
HANDLE hThread
);

这个是继续执行线程的API函数,用于将已经挂起的线程恢复执行,与SuspendThread对应。参数为创建线程时返回的线程HANDLE。

VOID ExitThread(
DWORD dwExitCode
);

这个是停止(销毁)线程的API函数,只能在线程内部使用。参数为退出码,一般可设为0。

BOOL TerminateThread(
HANDLE hThread,
DWORD dwExitCode
);

这个是强行停止(销毁)线程的API函数,能在程序的任意部分使用。但是使用这一API函数来终止线程是不安全的,可能造成程序不稳定。不推荐使用。参数一为创建线程时返回的线程HANDLE,参数二为退出码,一般可设为0。

windows api多线程的更多相关文章

  1. CPP-基础:windows api 多线程---互斥量、信号量、临界值、事件区别

    http://blog.csdn.net/wangsifu2009/article/details/6728155 四种进程或线程同步互斥的控制方法:1.临界区:通过对多线程的串行化来访问公共资源或一 ...

  2. 【转】Windows的多线程编程,C/C++

    在Windows的多线程编程中,创建线程的函数主要有CreateThread和_beginthread(及_beginthreadex). CreateThread 和 ExitThread    使 ...

  3. 【转】windows平台多线程同步之Mutex的应用

    线程组成:  线程的内核对象,操作系统用来管理该线程的数据结构. 线程堆栈,它用于维护线程在执行代码时需要的所有参数和局部变量.   操作系统为每一个运行线程安排一定的CPU时间 —— 时间片.系统通 ...

  4. c运行库、c标准库、windows API的区别和联系

    C运行时库函数C运行时库函数是指C语言本身支持的一些基本函数,通常是汇编直接实现的.  API函数API函数是操作系统为方便用户设计应用程序而提供的实现特定功能的函数,API函数也是C语言的函数实现的 ...

  5. Qt 事件系统浅析 (用 Windows API 描述,分析了QCoreApplication::exec()和QEventLoop::exec的源码)(比起新号槽,事件机制是更高级的抽象,拥有更多特性,比如 accept/ignore,filter,还是实现状态机等高级 API 的基础)

    事件系统在 Qt 中扮演了十分重要的角色,不仅 GUI 的方方面面需要使用到事件系统,Signals/Slots 技术也离不开事件系统(多线程间).我们本文中暂且不描述 GUI 中的一些特殊情况,来说 ...

  6. windows lua 多线程 线程同步

    今天在改一个程序,改成部分逻辑用lua写,这个程序是多线程的.将程序中部分逻辑改成lua之后,各种非法访问内存错误,各种奇奇怪怪的问题,不分时间,不分地点的出现崩溃.从调用堆栈来看,基本都是使用lua ...

  7. (转)c运行库、c标准库、windows API的区别和联系

    C运行时库函数C运行时库函数是指C语言本身支持的一些基本函数,通常是汇编直接实现的.  API函数API函数是操作系统为方便用户设计应用程序而提供的实现特定功能的函数,API函数也是C语言的函数实现的 ...

  8. Windows API 进程相关笔记

    0. 前言 最近做了一个进程信息相关的项目,整理了一下自己做项目时的笔记,分享给大家 1. 相关概念 1.1 HANDLE 概念 HANDLE(句柄)是Windows操作系统中的一个概念. 在Wind ...

  9. C# Windows API

    API:应用程序接口(API:Application Program Interface)应用程序接口(API:application programming interface)是一组定义.程序及协 ...

随机推荐

  1. Goroutines和线程对比

    目录 栈不同 调度不同 GOMAXPROCS Goroutine没有ID号 栈不同 线程:每一个OS线程都有一个固定大小的内存块(一般会是2MB)来做栈,这个栈会用来存储当前正在被调用或挂起(指在调用 ...

  2. SpringCloud之Zuul网关简介、映射vs过滤配置使用

    目的: Zuul路由网关简介及基本使用 Zuul路由映射配置 Zuul请求过滤配置 Zuul路由网关简介及基本使用 Zuul简介: Zuul是从设备和网站到Netflix流应用程序后端的所有请求的前门 ...

  3. Webform中的前后端分离

    Webform常用的开发方式 (1)运用服务器端控件的aspx页面 (2)一般处理程序+html静态页面+Ajax(所谓的前后端分离) (3)一般处理程序+html模板引擎   这里简单记录html+ ...

  4. 查看MacOS中的Swift版本和SDK版本

    查看MacOS中的Swift版本和SDK版本 来源 https://juejin.im/post/5cde5a62f265da1bc55230e5 # 查看Swift版本 xcrun swift -v ...

  5. Ant Design Pro实现导出Excel

    react Ant Design ProUI框架导出Excel(只能导出当前列表数据) 插件安装 npm install js-export-excel 安装完成之后开始引入 import Expor ...

  6. OO第三单元(地铁,JML)单元总结

    OO第三单元(地铁,JML)单元总结 这是我们OO课程的第二个单元,这个单元的主要目的是让我们熟悉并了解JML来是我们具有规格化编程架构的思想.这个单元的主题一开始并不明了,从第一次作业的路径到第二次 ...

  7. Swift之xib模块化设计

    一.解决问题 Xib/Storybarod可以方便.可视化的设置约束,在开发中也越来越重要.由于Xib不能组件化,使得封装.重用都变得不可行.本文将介绍一种解决方案,来实现Xib组件化. 二.模型块原 ...

  8. MySql注释的写法

    每一种语言都有它的注释方式,代码量少的时候还可以,随着代码量越来越多,代码注释的重要性也越发凸显. 在mysql中主要有三种方式: 1.常用的方式,跟在css中那些注释一样 :/* 内容 */ /* ...

  9. js 的七大原则--单一原则、开闭原则、替换原则(一)

    一.前言: js 的七大设计原则: 1.单一原则 2.开闭原则 3.里氏替换原则 4.依赖倒转原则 5.接口隔离原则 6.合成复用原则 7.迪米尔法则 二.单一原则 1.定义:单一原则就是一个对象或者 ...

  10. 实战FFmpeg--iOS平台使用FFmpeg将视频文件转换为YUV文件

    做播放器的开发这里面涉及的东西太多,我只能一步步往前走,慢慢深入.播放器播放视频采用的是渲染yuv文件.首先,要知道yuv文件是怎么转换得来的,其次,要知道怎么把视频文件保存为yuv文件.雷神的文章1 ...