`
deepfuture
  • 浏览: 4432200 次
  • 性别: Icon_minigender_1
  • 来自: 湛江
博客专栏
073ec2a9-85b7-3ebf-a3bb-c6361e6c6f64
SQLite源码剖析
浏览量:80373
1591c4b8-62f1-3d3e-9551-25c77465da96
WIN32汇编语言学习应用...
浏览量:70858
F5390db6-59dd-338f-ba18-4e93943ff06a
神奇的perl
浏览量:104125
Dac44363-8a80-3836-99aa-f7b7780fa6e2
lucene等搜索引擎解析...
浏览量:287656
Ec49a563-4109-3c69-9c83-8f6d068ba113
深入lucene3.5源码...
浏览量:15151
9b99bfc2-19c2-3346-9100-7f8879c731ce
VB.NET并行与分布式编...
浏览量:68400
B1db2af3-06b3-35bb-ac08-59ff2d1324b4
silverlight 5...
浏览量:32594
4a56b548-ab3d-35af-a984-e0781d142c23
算法下午茶系列
浏览量:46295
社区版块
存档分类
最新评论

VB.NET并行与分布式编程(6)-线程与内核同步[18]

 
阅读更多

一、RegisterWaitForSingleObject 方法

   RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int32, Boolean)  注册一个等待 WaitHandle 的委托,并指定一个 32 位带符号整数来表示超时值(以毫秒为单位)。 
   RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int64, Boolean)  注册一个等待 WaitHandle 的委托,并指定一个 64 位带符号整数来表示超时值(以毫秒为单位)。 
   RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, TimeSpan, Boolean)  注册一个等待 WaitHandle 的委托,并指定一个 TimeSpan 值来表示超时时间。 
   RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, UInt32, Boolean)  指定表示超时(以毫秒为单位)的 32 位无符号整数,注册一个委托等待 WaitHandle。 

 

将指定的委托排队到线程池。

 

 

 Public Shared Function RegisterWaitForSingleObject ( _
 waitObject As WaitHandle, _
 callBack As WaitOrTimerCallback, _
 state As Object, _
 millisecondsTimeOutInterval As Integer, _
 executeOnlyOnce As Boolean _
) As RegisteredWaitHandle
参数
waitObject
类型:System.Threading.WaitHandle
要注册的 WaitHandle。 使用 WaitHandle 而非 Mutex。

callBack
类型:System.Threading.WaitOrTimerCallback
waitObject 参数终止时调用的 WaitOrTimerCallback 委托。

state
类型:System.Object
传递给委托的对象。

millisecondsTimeOutInterval
类型:System.Int32
以毫秒为单位的超时。 如果 millisecondsTimeOutInterval 参数为 0(零),函数将测试对象的状态并立即返回。 如果 millisecondsTimeOutInterval 为 -1,则函数的超时间隔永远不过期。

executeOnlyOnce
类型:System.Boolean
如果为 true,表示在调用了委托后,线程将不再在 waitObject 参数上等待;如果为 false,表示每次完成等待操作后都重置计时器,直到注销等待。

 

 

 

当发生以下情况之一时,辅助线程将执行委托:

指定对象处于终止状态。

超时间隔已过期。

RegisterWaitForSingleObject 方法检查指定对象的 WaitHandle 的当前状态。 如果对象状态为非终止状态,则此方法将注册一个等待操作。 此等待操作由线程池中的一个线程来执行。 当对象状态变为终止或超时间隔已过期时,委托由辅助线程执行。 如果 timeOutInterval 参数不为 0(零),并且 executeOnlyOnce 参数为 false,则每当事件收到信号或超时间隔过期时都会重置计时器。

 

若要取消等待操作,请调用 RegisteredWaitHandle.Unregister 方法。

等待线程使用 Win32 WaitForMultipleObjects 函数来监视已注册的等待操作。 因此,如果必须在对 RegisterWaitForSingleObject 的多次调用中使用相同的本机操作系统句柄,则必须使用 Win32DuplicateHandle 函数重复该句柄。 请注意,不应为传递到 RegisterWaitForSingleObject 的事件对象发出脉冲,这是因为等待线程在重置前可能不会检测到该事件已终止。

返回前,函数将修改某些类型的同步对象的状态。 修改仅发生在其终止状态满足等待条件的对象上。 例如,信号量计数减少一。

二、WaitOrTimerCallback 委托
'声明
<ComVisibleAttribute(True)> _
Public Delegate Sub WaitOrTimerCallback ( _
 state As Object, _
 timedOut As Boolean _
)
参数
state
类型:System.Object
一个对象,包含回调方法在每次执行时要使用的信息。

timedOut
类型:System.Boolean
如果 WaitHandle 超时,则为 true;如果其终止,则为 false。

备注
--------------------------------------------------------------------------------

WaitOrTimerCallback 表示当已注册的等待句柄超时或终止时要执行的回调方法。 创建委托,方法是将回调方法传递给 WaitOrTimerCallback 构造函数。 您的方法必须具有此处所显示的签名。

通过将 WaitOrTimerCallback 委托和 WaitHandle 传递给 ThreadPool.RegisterWaitForSingleObject 创建已注册的等待句柄。 每次 WaitHandle 超时或终止时,执行您的回调方法。

[Visual Basic]

 注意 
Visual Basic 用户可以省略 WaitOrTimerCallback 构造函数,在向 RegisterWaitForSingleObject 传递回调方法时只需使用 AddressOf 运算符即可。 Visual Basic 将自动调用正确的委托构造函数。
 

如果要将信息传递给回调方法,则在创建已注册的等待句柄时,创建一个包含所需信息的对象并将它传递给 RegisterWaitForSingleObject。 每次执行您的回调方法时,state 参数都包含此对象。

 

 

三、Unregister方法
<ComVisibleAttribute(True)> _
Public Function Unregister ( _
 waitObject As WaitHandle _
) As Boolean
参数
waitObject
类型:System.Threading.WaitHandle
要发出信号的 WaitHandle。

返回值
类型:System.Boolean
如果函数成功,则为 true;否则为 false。

备注
--------------------------------------------------------------------------------

如果指定了 waitObject,只有在成功注销 RegisteredWaitHandle 之后它才会终止。 如果在 Unregister 执行时回调方法正在进行,则直到回调方法完成之后 waitObject 才会终止。 特别是,如果回调方法执行 Unregister,则直到回调方法完成之后 waitObject 才会终止。

 

 

Imports System
Imports System.Threading
Imports System.Runtime.InteropServices
Imports System.Diagnostics
Imports System.Diagnostics.ThreadState


Module Module1
    Dim jg As Long = 0
    Public Class TaskInfo
        Public Handle As RegisteredWaitHandle = Nothing
        Public OtherInfo As String = "default"
        Public ev As AutoResetEvent
    End Class


    <MTAThread()> _
    Sub Main()








        '定义AutoResetEvent和RegisteredWaitHandle对象
        Dim myHandle As RegisteredWaitHandle = Nothing


        Dim ti As New TaskInfo()
        ti.ev = New AutoResetEvent(False)
        ti.OtherInfo = "deepfuture test"
        '注册等待,等待线程的任务就是定时取计算结果,如果没有计算完成,就继续等待
        ti.Handle = ThreadPool.RegisterWaitForSingleObject( _
           ti.ev, _
           New WaitOrTimerCallback(AddressOf mythreadrun), _
           ti, _
           100, _
           False _
       )
        Console.Write("{0},开始执行线程,主线程{1}正在计算结果", Now.ToLongTimeString, Thread.CurrentThread.ManagedThreadId)
        '等待并执行其它代码
        For mynum = 1 To 100
            jg += mynum
            Thread.Sleep(10)
            Console.WriteLine("主线程{0}正在运行.....当前计算结果为{1}", Now.ToLongTimeString, jg)
        Next
        Console.WriteLine("主线程  " & Now.ToLongTimeString & "线程计算完毕!")
        '设置为终止状态,触发回调
        ti.ev.Set()
        Thread.Sleep(20)


    End Sub
    Public Sub mythreadrun(ByVal state As Object, ByVal timedOut As Boolean)
        '本线程的任务是的计算完成后显示结果,没计算完成时,做其它工作,
        '在这里其他工作就是显示一个"."
        Dim ti As TaskInfo = CType(state, TaskInfo)
        If timedOut Then
            '时间到,仍没计算完毕,为非终止状态 
            Console.WriteLine("等待时间到,计算没有完毕,继续等待...")
        Else
            If Not ti.Handle Is Nothing Then
                '已经终止
                ti.Handle.Unregister(Nothing)
            End If
            Console.WriteLine("主线程{0}运行完成.....读取最终计算结果为{1}", Now.ToLongTimeString, jg)
        End If
    End Sub
End Module

 

 

 

 

  • 大小: 95.4 KB
分享到:
评论

相关推荐

    pimpinella_3cd_01_0716.pdf

    pimpinella_3cd_01_0716

    FIB English learning

    FIB English learning

    linux下 jq 截取json文件信息

    X86-jq安装包

    [AB PLC例程源码][MMS_046356]SELX.zip

    AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

    大圣挪车小程序1.3.5+前端.zip

    大圣挪车小程序1.3.5 前端

    Manus.im 产品及开发团队研究报告.pdf

    Manus.im 产品及开发团队研究报告.pdf

    [AB PLC例程源码][MMS_044663]Control daisy chain wiring in Fieldbus Foundation.zip

    AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

    sun_3ck_01a_0918.pdf

    sun_3ck_01a_0918

    支持适用于PERC H330/H730/H730P/H830/H730P系列RAID卡MX/FD33xD/FD33xS控制器的驱动安装指南

    下载 1. 单击“立即下载”,以下载该文件。 2. 出现“文件下载”窗口后,单击“保存”,以将文件保存到硬盘。 安装 1. 浏览至文件下载目标位置并双击新下载的文件。 2. 仔细阅读对话窗口中显示的发布信息。 3. 下载并安装对话窗口中标识的任何必备项,然后再继续。 4. 单击“Install”(安装)按钮。 5. 按照其余提示执行更新。 安装 1. 将解压的文件复制到可访问Windows的介质。 2. 将系统重新引导至Windows操作系统。 3. 打开“服务器管理器”->“设备管理器”->“存储控制器”,然后单击“PERC控制器”。 5. 单击“更新驱动程序软件”,并按照提示更新驱动程序。 4. 重新引导系统以使更改生效。

    硬盘安装器,支持硬盘安装,无需制作U盘PE!

    支持所有操作系统一键安装。

    matlab程序代码项目案例:使用 Simulink 进行自适应 MPC 设计

    matlab程序代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

    [AB PLC例程源码][MMS_044098]1769-ASCII Simultaneous Mode.zip

    AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

    swanson_01_1106.pdf

    swanson_01_1106

    [AB PLC例程源码][MMS_047811]SAF1 - Store.zip

    AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

    [AB PLC例程源码][MMS_043879]Programming in SFC and ST Language.zip

    AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

    sun_3ck_01_0919.pdf

    sun_3ck_01_0919

    方言距离数据.岭南学院产业与区域经济研究中心

    各城市方言距离数据-中山大学岭南学院产业与区域经济研究中心 方言距离是指两种或多种方言之间的相似程度或差异程度。参考中山大学岭南学院产业与区域经济研究中心的刘毓芸等(2015)文献。他们基于方言树图,并参考《汉语方言大词典》和《中国语言地图集》对方言的划分,将汉语方言从宽泛到具体分为以下几个层级:汉语→方言大区→方言区→方言片。为了量化县与县之间的方言差异,他们采用了一种赋值方法: 若它们分属不同方言大区,则距离为3。: 若两个县同属一个方言片,则它们之间的方言距离为0; 若两个县属于同一方言区但不同方言片,则距离为1; 若它们属于同一方言大区但不同方言区,则距离为2; 方言距离是一个反映方言之间相似程度或差异程度的重要指标,它在语音识别、方言研究等领域具有广泛的应用价值。 参考文献:[1]刘毓芸, 徐现祥, 肖泽凯. 2015. 劳动力跨方言流动的倒U型模式[J]. 经济研究, 50(10): 134-146+162. 指标 语系、语族、方言大区、方言区/语支、方言片/语种、Supergroup、Dialect、group、Sub-dialect、groupPref_1、Pref_2、DiaDist、PrefCode_1、PrefCode_2等等。

    基于PCA算法的人脸识别MATLAB源码

    基于PCA算法的人脸识别MATLAB源码

    [AB PLC例程源码][MMS_045740]Handling manual movement of axis using an Add On Instruction (AOI), .zip

    AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

    lim_3ck_01a_0518.pdf

    lim_3ck_01a_0518

Global site tag (gtag.js) - Google Analytics