实验内容:编写和调试一个程序,实现Windows系统环境下通过API函数进行线程创建与撤销。

实验目的

(1) 熟悉Windows系统提供的线程创建和撤销系统调用;

(2) 掌握Windows系统环境下线程的创建与撤销方法。

实验要求:能正确的使用CreateThread()、Sleep()、ExitThread()等系统调用函数,进一步理解进程与线程理论。

实验题目:使用系统调用函数CreateThread()创建一个子线程,并在子线程中显示:Thread is Running!。使用函数Sleep()使线程挂起5s,之后使用函数ExitThread()撤销线程。

实验环境:VC++6.0

实验预备知识:相关API函数介绍

1.线程的创建

CeateThread()完成线程的创建.它在调用进程的地址空间上创建一个线程,执行指定的函数,并返回新建立的线程的句柄.

原型:

HANDLE CeateThread(

LPSECURITY_ATTRIBUTES lpThreadAttributes, //安全属性指针

DWORD dwStackSize, //线程堆栈大小

LPSECURITY_START_ROUTINE lpStartAddress, //线程所要执行的函数

LPVOID lpparameter, ///线程对应函数要传递的参数

DWORD dwCreationFlags, //线程创建后所处的状态

LPDWORD lpThreadId  //线程标识符指针

);

参数说明:

(1) lpThreadAttributes:为线程指定安全属性。为NULL时,线程得到一个默认的安全描述符。

(2) dwStackSize:线程堆栈的大小。其值为0时,其大小与调用该线程的线程堆栈大小相同。

(3) lpStartAddress:指定线程要执行的函数。

(4) Lpparameter:函数中要传递的参数。

(5) dwCreationFlags:线程创建后所处状态。若为CRRATE_SUSPENDED,表示创建后出于挂起状态,用ResumeThread()激活线程才可以执行.若该值为0,表示线程创建后立即执行。

(6) lpThreadId:用一个32位的变量接受系统返回的线程标识符。若该值设为NULL,系统不返回线程标识符。

返回值

如果线程创建成功,将返回线程的句柄;如果失败,系统返回NULL,可以调用函数GetLastError查询失败的原因。

用法举例

static HANDLE hHandle1=NULL; //用于存储线程返回句柄的变量

DWORD dwThreadID1;           //用于存储线程标识符的变量

//创建一个名为ThreadName1的线程

hHandle1=CeateThread((LPSECURITY_ATTRIBUTES)) NULL

0,

(LPSECURITY_START_ROUTINE)ThreadName1,

(LPDWORD)NULL,

0,&dwThreadID1);

2.撤销进程

ExitThread()用于撤销当前进程.

原型

VOID ExitThread(

DWORD dwExitCode  //线程返回码

);

参数说明:

dwExitCode:指定线程返回码,可以调用GetExitCodeThread()查询返回码的含义。

返回值:

该函数没有返回值。

用法举例

ExitThread(0);   //参数0表示要撤销进程中的所有线程

3.终止线程

TerminateThread()用于终止当前线程。该函数与ExitThread()的区别在于,ExitThread()在撤销线程时将该线程所拥有的资源全部归还给系统,而TerminateThread()不归还资源。

原型

BOOL TerminateThread(

HANDLE hHandle,       //线程句柄

DWORD dwExitCode    //线程返回码

);

参数说明

(1) hThread:要终止线程的线程句柄。

(2) dwExitCode:指定线程返回码,可以调用GetExitCodeThread()查询返回码的含义。

返回值

函数调用成功,将返回一个非0值;若失败,返回0,可以调用函数GetLastError()查询失败的原因。

4.挂起线程

Sleep()用于挂起当前正在执行的线程。

原型

VOID Sleep(DWORD dwMilliseconds);

参数说明

dwMilliseconds:指定挂起时间,单位为ms(毫秒)。

返回值

该函数没有返回值。

5.关闭句柄

函数CloseHandle()用于关闭已打开的对象的句柄,其作用与释放动态申请的内存空间类似,这样可以释放系统资源,使线程安全运行。

原型:

BOOL CloseHandle(HANDLE hObject);

参数说明

hObject:已打开对象的句柄。

返回值:

如果函数调用成功,则返回值为非0值;如果函数调用失败,则返回值为0。若要得到更多的错误信息,调用函数GetLastError()查询。

实验指导:

本实验在Windows系统、Microsoft Visual C++ 6.0环境下实现,利用Windows SDK提供的API完成程序的功能。实验在Windows 环境下安装由于Microsoft Visual C++ 6.0是一个集成开发环境,其中包含了Windows SDK 所有工具和定义,所以安装了Microsoft Visual C++ 6.0后不用再安装SDK。实验中所有的API是操作系统提供的用来进行应用程序开发的系统功能接口。

(1)首先启动安装好的Microsoft Visual C++6.0。

(2)在Microsoft Visuanl C++6.0环境下选择File->New命令,然后在Project选项卡中选择Win32 Console Application 选项建立一个控制台工程文件。

(3)由于CreateThread()等函数是Microsoft Windows操作系统的系统调用函数,因此在图1.1中选中An application that supports MFC单选按钮,然后单击Finish按钮。

图1.1 建立一个MFC支持的应用程序

(4)打开Microsoft Visual C++6.0编辑环境,按本实验的要求编辑C程序,再编译、链接并运行改程序即可。

实验预习要求、实验条件、方法及步骤 :

1.学习预备知识,掌握创建和撤销线程API的用法。

2.画出相应的程序流程图。

3.按照程序流程图,编程并实现。

思考题 :

1.如何向线程对应的函数传递参数?一个参数如何传递?多个参数如何传递?

2.深入理解线程与进程的概念,在Windows环境下何时使用进程?何时使用线程?

devexpress 创建窗口句柄时出错_实验一 线程的创建和撤销相关推荐

  1. winform 创建窗口句柄时出错

    最近在做一个winform 的项目,由于是需要多页面切换跳转的,所以用了MDI窗体,经常需要子窗体之间跳转,窗体的跳转的代码如下: FormFaceLogin frm = new FormFaceLo ...

  2. devexpress 创建窗口句柄时出错_MATLAB函数句柄

    1.何为函数句柄? 函数句柄也是MATLAB中的一种常见的数据类型, 它的地位类似于其它计算机语言里的函数对象(Javascript,Python),函数指针(C++),或者函数引用(Perl). 它 ...

  3. 创建声音流时出错_如何设计微交互创建出色用户体验方案

    ♝点击上方"交互设计学堂"关注我们,送电子书 很多人把微交互简单的理解为做个动效,实质上,我们通常见到的那些动效只是微交互构成中的一部分,属于反馈层面的视觉表达. 微交互既不是一个 ...

  4. System.ComponentModel.Win32Exception:“创建窗口句柄时出错。 如何解决

    琢磨两天终于已解决. 原来原因是用了第三方控件的原因. 换了datagridview 框架本身的控件就可以了.

  5. 创建窗体时出错。有关详细信息,请参阅 Exception.InnerException

    创建窗体时出错.有关详细信息,请参阅 Exception.InnerException.错误为: 未能加载文件或程序集"xxx, Version=1.0.0.0, Culture=neutr ...

  6. sqlplus创建语句时提示表空间不存在和创建时权限不足

    sqlplus创建语句时提示表空间不存在和创建时权限不足 显示权限不足所以可以通过conn sys as sysdba 连接后 继续上述代码创建表空间就可以了.

  7. word文档保存文件时出错_保存时如何自动创建Word文档的备份副本

    word文档保存文件时出错 Backing up your documents is always a good thing to do, but not always something we re ...

  8. web 错误 处理你的请求时出错_最强辅助Jmeter技术干货:JMeter中处理器的另类玩法...

    在JMeter中有两种类型的处理器,即"前置处理器"和"后置处理器",主要用来对其覆盖范围内采样器请求和响应的内容进行修改或截获. [前置处理器] " ...

  9. mysql中创建视图语法错误_mysql - 使用过程MySQL创建视图时出错 - 堆栈内存溢出

    尝试使用过程创建视图时出现问题. 我必须这样做,因为我需要在MySQL中发挥作用,将表的行转换为另一个表的列. 该查询效果很好,但是当我将其放在" CREATE VIEW"语句中时 ...

最新文章

  1. Web应用NLB群集
  2. netlogon启动后停止_自耦变压器降压启动原理
  3. LFS 8.3 中文翻译版本发布!
  4. Spring的AOP和IOC是什么?使用场景有哪些?Spring事务与数据库事务,传播行为,数据库隔离级别
  5. 介绍Azure服务平台,.NET Services及其中的访问控制服务(Access Control)
  6. 2021-04-10 【数据库导数】数字类型的列如果位数过长,变为科学计数法问题
  7. Docker 容器导出为镜像
  8. 第29月第14天 evpp
  9. SpringBoot 修改仓库
  10. 王码五笔98版forwin10_王码五笔输入法98版
  11. wifi 小米pro 驱动 黑苹果_【黑果小兵】小米Pro macOS High Sierra 10.13黑苹果安装教程...
  12. 蓝牙小车换一个蓝牙串口助手就不管用了?
  13. js图片上传(配合七牛云)
  14. openproject_OpenProject入门
  15. 使用MapReduce实现专利文件的分析
  16. QCon校友会之柴锋:10次QCon之旅
  17. Perl脚本语言(一)
  18. C++STL之map详解
  19. 无事可做的张张,没事更新点方法吧~~~~
  20. oracle dba 创建视图,拥有dba权限的情况下创建视图报ORA-01031: insufficient privileg错误...

热门文章

  1. 有趣的JS 一行代码 偷取所有图片
  2. WINDOWS下面使用ICE操作记录
  3. 6.Java 面试题整理(XML)
  4. 利用Eigen进行矩阵计算
  5. 解决VsCode中C程序无法键盘输入的问题
  6. 安卓案例:闪烁满天星
  7. 贴一下目前的工作任务列表
  8. idea @value提示_IDEA 中springboot 项目使用 注解Autowired 出现红线
  9. 【Level 08】U07 Mixed Feelings L1 Day trip
  10. 【Python】Python3.7.3 - Collections (Arrays) - List数据类型