VB.NET中的线程操作(Thread,Mutex)

2024-05-01 01:38
文章标签 线程 操作 net vb thread mutex

本文主要是介绍VB.NET中的线程操作(Thread,Mutex),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

VB.NET中的线程操作(Thread,Mutex)

By Tyouvivi 2008/04/16

VB.NET 2005 中线程操作稍有点麻烦,Abort()方法调用时会产生System.Threading.ThreadAbortException异常信息,而继续已挂起的线程方法Resume()和挂起方法Suspend()也不再支持,线程的暂停、再开、结束不是很方便,在此使用Mutex类(同步基元)进行线程的操作。

Mutex介绍

当两个或更多线程需要同时访问一个共享资源时,系统需要使用同步机制来确保一次只有一个线程使用该资源。Mutex 是同步基元,它只向一个线程授予对共享资源的独占访问权。如果一个线程获取了互斥体,则要获取该互斥体的第二个线程将被挂起,直到第一个线程释放该互斥体。

可以使用 WaitHandle..::.WaitOne 方法请求互斥体的所属权。拥有互斥体的线程可以在对 WaitOne 的重复调用中请求相同的互斥体而不会阻止其执行。但线程必须调用 ReleaseMutex 方法同样多的次数以释放互斥体的所属权。Mutex 类强制线程标识,因此互斥体只能由获得它的线程释放。相反,Semaphore 类不强制线程标识。

如果线程在拥有互斥体时终止,则称此互斥体被放弃。将此 mutex 的状态设置为收到信号,下一个等待线程将获得所有权。从 .NET Framework 
2.0  版开始,在获取被放弃 mutex 的下一个线程中将引发 AbandonedMutexException。在 .NET Framework  2.0  版之前,这样不会引发任何异常。

 ThreadState Form
    三个按钮: ButtonStart、ButtonPause、ButtonStop
    两个状态Label: 执行状况、LabelStatus
   
代码如下:

Public   Class ThreadState

    
''' <summary>
    ''' 状态
    ''' </summary>
    ''' <remarks></remarks>
    Enum ThreadState As Integer
        Runing 
= 1      ''执行中
        Paused = 2      ''暂停
        Stoped = 3      ''结束
    End Enum


    
''' <summary>
    ''' 线程
    ''' </summary>
    ''' <remarks></remarks>
    Private _thread As System.Threading.Thread

    
''' <summary>
    ''' 同步基元,用于进程间同步。
    ''' </summary>
    ''' <remarks></remarks>
    Private _mutex As Threading.Mutex

    
''' <summary>
    ''' 线程状态
    ''' </summary>
    ''' <remarks></remarks>
    Private _state As ThreadState

    
''' <summary>
    ''' 线程调用外部控件方法(Delegate)
    ''' </summary>
    ''' <param name="text"></param>
    ''' <remarks></remarks>
    Delegate Sub SetTextCalled(ByVal [text] As String)

    
''' <summary>
    ''' Form Load
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub ThreadTest_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        
''状态初期化
        Me._state = ThreadState.Stoped
        
''按钮初期化
        SetButtonState()
        SetText(
"未开始...")

    
End Sub


    
''' <summary>
    ''' 执行
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub Execute()
        
Dim i As Integer = 1

        
''执行直到结束
        Do While Not Me._state = ThreadState.Stoped

            _mutex.WaitOne()
            _mutex.ReleaseMutex()

            SetText(
"执行中... " & "   " & i)
            i 
+= 1
            Threading.Thread.Sleep(
1000)
        
Loop

        SetText(
"结束")
    
End Sub


    
''' <summary>
    ''' 线程开始,再开
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub ButtonStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonStart.Click

        
If Me._state = ThreadState.Stoped Then
            _thread 
= New System.Threading.Thread(AddressOf Execute)        ''线程开始
            ''同步基元初始化
            _mutex = New Threading.Mutex
            _thread.Start()
        
ElseIf Me._state = ThreadState.Paused Then                           ''线程再开
            ''同步基元释放(线程继续)                     
            _mutex.ReleaseMutex()
        
End If

        
''线程状态
        Me._state = ThreadState.Runing
        SetButtonState()

    
End Sub


    
''' <summary>
    ''' 暂停
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub ButtonPause_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonPause.Click
        
'SetText("Pasue")
        ''同步基元暂停(线程暂停)
        _mutex.WaitOne()
        
Me.ButtonStart.Enabled = True
        
Me._state = ThreadState.Paused
        SetButtonState()
    
End Sub


    
''' <summary>
    ''' 结束
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub ButtonStop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonStop.Click

        
If Me._state = ThreadState.Paused Then
            
''同步基元释放(线程继续) 
            _mutex.ReleaseMutex()
        
End If
        
''状态设置
        Me._state = ThreadState.Stoped
        SetButtonState()
        _thread 
= Nothing

    
End Sub


    
''' <summary>
    ''' 执行状态
    ''' </summary>
    ''' <param name="str"></param>
    ''' <remarks></remarks>
    Private Sub SetText(ByVal str As String)
        
''线程中调用时需要Invoke(InvokeRequired = True)
        If Me.LabelStatus.InvokeRequired Then
            
Dim d As New SetTextCalled(AddressOf SetText)
            
Me.Invoke(d, New Object() {str})
        
Else
            
Me.LabelStatus.Text = str
        
End If

    
End Sub


    
''' <summary>
    ''' 按钮状态
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub SetButtonState()
        
Select Case Me._state
            
Case ThreadState.Runing
                
Me.ButtonStart.Enabled = False
                
Me.ButtonPause.Enabled = True
                
Me.ButtonStop.Enabled = True
            
Case ThreadState.Paused
                
Me.ButtonStart.Text = "Resume"
                
Me.ButtonStart.Enabled = True
                
Me.ButtonPause.Enabled = False
                
Me.ButtonStop.Enabled = True
            
Case ThreadState.Stoped
                
Me.ButtonStart.Text = "Start"
                
Me.ButtonStart.Enabled = True
                
Me.ButtonPause.Enabled = False
                
Me.ButtonStop.Enabled = False
        
End Select
    
End Sub

End Class

 运行效果如下:

 

这篇关于VB.NET中的线程操作(Thread,Mutex)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/950421

相关文章

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

如何在Visual Studio中调试.NET源码

今天偶然在看别人代码时,发现在他的代码里使用了Any判断List<T>是否为空。 我一般的做法是先判断是否为null,再判断Count。 看了一下Count的源码如下: 1 [__DynamicallyInvokable]2 public int Count3 {4 [__DynamicallyInvokable]5 get

2、PF-Net点云补全

2、PF-Net 点云补全 PF-Net论文链接:PF-Net PF-Net (Point Fractal Network for 3D Point Cloud Completion)是一种专门为三维点云补全设计的深度学习模型。点云补全实际上和图片补全是一个逻辑,都是采用GAN模型的思想来进行补全,在图片补全中,将部分像素点删除并且标记,然后卷积特征提取预测、判别器判别,来训练模型,生成的像

Thread如何划分为Warp?

1 .Thread如何划分为Warp? https://jielahou.com/code/cuda/thread-to-warp.html  Thread Index和Thread ID之间有什么关系呢?(线程架构参考这里:CUDA C++ Programming Guide (nvidia.com)open in new window) 1维的Thread Index,其Thread

动手学深度学习【数据操作+数据预处理】

import osos.makedirs(os.path.join('.', 'data'), exist_ok=True)data_file = os.path.join('.', 'data', 'house_tiny.csv')with open(data_file, 'w') as f:f.write('NumRooms,Alley,Price\n') # 列名f.write('NA

线程的四种操作

所属专栏:Java学习        1. 线程的开启 start和run的区别: run:描述了线程要执行的任务,也可以称为线程的入口 start:调用系统函数,真正的在系统内核中创建线程(创建PCB,加入到链表中),此处的start会根据不同的系统,分别调用不同的api,创建好之后的线程,再单独去执行run(所以说,start的本质是调用系统api,系统的api

Java IO 操作——个人理解

之前一直Java的IO操作一知半解。今天看到一个便文章觉得很有道理( 原文章),记录一下。 首先,理解Java的IO操作到底操作的什么内容,过程又是怎么样子。          数据来源的操作: 来源有文件,网络数据。使用File类和Sockets等。这里操作的是数据本身,1,0结构。    File file = new File("path");   字

MySQL——表操作

目录 一、创建表 二、查看表 2.1 查看表中某成员的数据 2.2 查看整个表中的表成员 2.3 查看创建表时的句柄 三、修改表 alter 3.1 重命名 rename 3.2 新增一列 add 3.3 更改列属性 modify 3.4 更改列名称 change 3.5 删除某列 上一篇博客介绍了库的操作,接下来来看一下表的相关操作。 一、创建表 create

java线程深度解析(六)——线程池技术

http://blog.csdn.net/Daybreak1209/article/details/51382604 一种最为简单的线程创建和回收的方法: [html]  view plain copy new Thread(new Runnable(){                @Override               public voi

java线程深度解析(五)——并发模型(生产者-消费者)

http://blog.csdn.net/Daybreak1209/article/details/51378055 三、生产者-消费者模式     在经典的多线程模式中,生产者-消费者为多线程间协作提供了良好的解决方案。基本原理是两类线程,即若干个生产者和若干个消费者,生产者负责提交用户请求任务(到内存缓冲区),消费者线程负责处理任务(从内存缓冲区中取任务进行处理),两类线程之