易语言 / 随手记

事件控制循环任务退出(CreateEventA/SetEvent/ResetEvent/WaitForSingleObject)

奶瓶 · 8月25日 · 2020年 43次已读

CreateEventA

Dll命令名:CreateEventA
创建一个事件对象,成功则返回事件的句柄,如果失败,则返回0.
所处动态链接库的文件名:kernel32.dll
在所处动态链接库中的命令名:CreateEventA
返回值类型:整数型
参数<1>的名称为“lpEventAttributes”,类型为“整数型”。注明:指向一个SECURITY_ATTRIBUTES结构,主要用来指定事件对像是否可以被继承,如果事件对像不需要被继承,可以设为NULL.
参数<2>的名称为“bManualReset”,类型为“逻辑型”。注明:参数指定事件对象是否需要手动复位 如果指定TRUE,对事件对象状态的复位工作必须使用ResetEvent函数手动完成 如果指定FALSE,当测试事件的函数返回时,对象的状态会自动被复位.
参数<3>的名称为“bInitialState”,类型为“逻辑型”。注明:指定事件对象创建时的初始状态 TRUE表示初始状态是置位状态 FALSE表示初始状态是复位状态。
参数<4>的名称为“lpName”,类型为“文本型”。注明:指向一个0结尾的字符串,用来指定事件对象的名称,如果不需要命名,可以用NULL。

SetEvent

Dll命令名:SetEvent
将事件状态置位
所处动态链接库的文件名:kernel32.dll
在所处动态链接库中的命令名:SetEvent
返回值类型:逻辑型
参数<1>的名称为“hEvent”,类型为“整数型”。注明:指定事件的句柄。

ResetEvent

Dll命令名:ResetEvent
将事件状态复位
所处动态链接库的文件名:kernel32.dll
在所处动态链接库中的命令名:ResetEvent
返回值类型:逻辑型
参数<1>的名称为“hEvent”,类型为“整数型”。注明:指定事件的句柄。

WaitForSingleObject

Dll命令名:WaitForSingleObject
等待指定对象,直到处于发信号状态或超时间隔过去。返回对象状态(以“WAIT_”开头常量)。
所处动态链接库的文件名:kernel32.dll
在所处动态链接库中的命令名:WaitForSingleObject
返回值类型:整数型
参数<1>的名称为“hHandle”,类型为“整数型”。注明:对象的句柄(事件、互斥体、进程、信号、线程、等…)。如果在等待仍未完成的情况下关闭了此句柄,则该函数的行为是不确定的。句柄必须具有SYNCHRONIZE访问权限。
参数<2>的名称为“dwMilliseconds”,类型为“整数型”。注明:超时间隔(以毫秒为单位)。如果指定了非零值,则函数将等待直到发出信号通知对象或间隔过去。如果为零,则立即返回。如果为INFINITE(-1),则仅在对象发出信号时返回

示例代码:

.版本 2
.支持库 EThread

.程序集 程序集1
.程序集变量 集_退出事件, 整数型

.子程序 _启动子程序, 整数型, , 本子程序在程序启动后最先执行


启动线程 (&线程_主循环, , )  ' 创建一个循环线程
集_退出事件 = CreateEventA (0, 真, 假, 字符 (0))  ' 创建一个事件对象

' 如果是做退出事件ResetEvent可不用
ResetEvent (集_退出事件)  ' 复位WaitForSingleObject 返回非0

返回 (0)  ' 可以根据您的需要返回任意数值

.子程序 销毁

' 这里就是销毁或者关闭方法,同时调用SetEvent 使你的线程退出
SetEvent (集_退出事件)  ' 置位使WaitForSingleObject 返回0

.子程序 线程_主循环

.判断循环首 (真)
    ' //你的代码

    .如果真 (WaitForSingleObject (集_退出事件, 1000) = 0)  ' 1000为等待时间,相当于延时。
        跳出循环 ()  ' 满足条件将跳出循环关闭线程
    .如果真结束
    ' 不满足将继续循环
.判断循环尾 ()

代码截图

事件控制循环任务退出
0 条回应