VB .NET多线程步骤和例程

合集下载

VB_.NET多线程编程的详细说明(完整版)

VB_.NET多线程编程的详细说明(完整版)

VB .NET多线程编程的详细说明介绍传统的Visual Basic开发人员已经建立了同步应用程序,在这些程序中事务按顺序执行。

尽管由于多个事务多多少少地同时运行使多线程应用程序效率更高,但是使用先前版本的Visual Basic很难建立这类程序。

多线程程序是可行的,因为操作系统是多任务的,它有模拟同一时刻运行多个应用程序的能力。

尽管多数个人计算机只有一个处理器,但是现在的操作系统还是通过在多个执行代码片断之间划分处理器时间提供了多任务。

线程可能是整个应用程序,但通常是应用程序可以单独运行的一个部分。

操作系统根据线程的优先级和离最近运行的时间长短给每一个线程分配处理时间。

多线程对于时间密集型事务(例如文件输入输出)应用程序的性能有很大的提高。

但是也有必须细心的地方。

尽管多线程能提高性能,但是每个线程还是需要用附加的内存来建立和处理器时间来运行,建立太多的线程可能降低应用程序的性能。

当设计多线程应用程序时,应该比较性能与开销。

多任务成为操作系统的一部分已经很久了。

但是直到最近Visual Basic程序员才能使用无文档记录特性(undocumented)或者间接使用COM组件或者操作系统的异步部分执行多线程事务。

.NET框架组件为开发多线程应用程序,在System.Threading名字空间中提供了全面的支持。

本文讨论多线程的好处以及怎样使用Visual Basic .NET开发多线程应用程序。

尽管Visual Basic .NET和.NET框架组件使开发多线程应用程序更容易,但是本文作了调整使其适合高级读者和希望从早期Visual Basic转移到Visual Basic .NET的开发人员。

多线程处理的优点尽管同步应用程序易于开发,但是它们的性能通常比多线程应用程序低,因为一个新的事务必须等待前面的事务完成后才能开始。

如果完成某个同步事务的时间比预想的要长,应用程序可能没有响应。

多线程处理可以同时运行多个过程。

VB多线程的几种实现方法概述

VB多线程的几种实现方法概述

VB多线程的⼏种实现⽅法概述转⾃先说多线程:⽅法 1 : CreateThread不⽤多说,万变不离其宗,这是 Win32 内创建线程的唯⼀系统⽅法,以下介绍的多线程创建⽅式虽然不直接接触这个 Win32 APi,但系统也是通过他创建的。

⽅法 2 : TimerSetEvent这个函数是 Win32 系统的⼀个⾼精度计时器函数,通过调⽤这个函数,系统会创建⼀个新的线程,让Timer 回调函数中的代码运⾏在这个新线程中。

⽅法 3 : SHCreateThread很多⼈应该没见过这个函数,这是 shlwapi.dll 的⼀个导出函数,这个函数看字⾯也能理解是个创建多线程的函数,⽽且。

他是基于对象操作的多线程函数,也就是说他能够稳定的运⾏⼀些⽤上⾯2种⽅法创建,但不能稳定运⾏的代码。

⾄少这个函数在 IDE 的环境下表现的中规中矩!使⽤⽅法可查 API-GUIDE⽅法 4 :想起来了, CreateRemoteThread创建远程线程,经测试⼀点也不稳定,根本没法说下去了,还不如直接调⽤ CreateThread但,做为⼀种线程的创建⽅法,还是希望能够熟悉⼀下,如果不⽤VB写代码,要写跨进程线程,这是⼀个简单易⾏的办法,否则只能继续SetWindowHook了,熟悉汇编指令的还可以远程分配内存写硬编码执⾏⽅法 5 :简单说下 ActiveX ⽅式的多线程论坛⾥⾯有⽤这种⽅法实现的稳定多线程,代码虽好,但我却不会⽤,在倡导绿⾊软件的今天,为了⼀个多线程,⽽注册表⾥⾯⼜要多点xx,不好。

⽽且卸载⿇烦。

⽤ ActiveX 创建线程与其他⽅式创建的线程最重要的地⽅要主义,任何VB函数的调⽤最好都建⽴在新线程中新初始化的对象基础上执⾏,不要跨对象调⽤,⽽ ActiveX 的安全线程本⾝也正是利⽤了这点,不知道研究 ActiveX 的⽼⼤们有没注意,利⽤他特性实现的多线程,是初始化的⼀个新的线程,⽽这个线程中初始化的对象则是整个⼯程。

vb教程之在你的VB.NET应用程序中使用多线程

vb教程之在你的VB.NET应用程序中使用多线程

vb教程之在你的应⽤程序中使⽤多线程很长时间以来,开发⼈员⼀直要求微软为VB增加更多的线程功能——这⼀点在中终于实现了。

VB6不⽀持创建多线程的EXE、DLL以及OCX。

但这种措词容易引起误解,这是因为VB6⽀持执⾏多个单线程的单元。

⼀个单元实际上是代码执⾏的场所⽽且单元的边界限制了外部代码对单元内部的访问。

⽀持创建⾃由线程的应⽤程序。

这意味着多个线程可以访问同⼀个共享的数据集。

本⽂将带领你了解多线程的基本内容。

虽然VB⽀持多个单线程的单元,但并不⽀持允许多个线程在同⼀个数据集上运⾏的⾃由线程模型。

在很多情况下,产⽣⼀个运⾏后台处理程序的新线程会提⾼应⽤程序的可⽤性。

⼀种很显然的情况就是当执⾏⼀个可能使窗体看起来停⽌响应的长过程时,你⼀定会想在窗体上放置⼀个取消按钮。

解决⽅法由于使⽤公共语⾔运⾏时(Common Language Runtime),它增强了很多新的特性,其中之⼀便是创建⾃由线程应⽤程序的能⼒。

在中,开始使利⽤线程进⾏⼯作是很容易的。

稍后我们会探究⼀些精妙之处,我们先创建⼀个简单的窗体,它⽣成⼀个执⾏后台处理程序的新线程。

我们需要做的第⼀件事是将要在新线程上运⾏的后台处理程序。

下⾯的代码执⾏⼀个相当长的运⾏过程——⼀个⽆限循环:Private Sub BackgroundProcess()Dim i As Integer = 1Do While TrueListBox1.Items.Add("Iterations: " + i)i += 1LoopEnd Sub这段代码⽆限地循环并在每次循环中向窗体上的列表框中增加⼀个条⽬。

如果你对不熟悉的话,便会发现这段代码中有⼀些在VB6中⽆法完成的事:l 在声明变量时对其赋值 Dim i As Integer=1l 使⽤+=操作符 i+=1代替了i=i+1l Call关键字已经被去除了⼀旦我们有了⼀个⼯作过程,便需要将这段代码指派给⼀个新的线程并开始它的执⾏。

Visual Basic.net的多线程机制

Visual Basic.net的多线程机制
是 为 了使 多个 进 程 并发 执 行 , 以改 善资 源 利 用 率 和提
级 线 程 的这 一 系列 操作 则 不 需要 系统 干 预 , 系统 也 不
会 感 知 到用 户线 程 的存 在 , 任何 线 程 的操 作 系统 都会
认为 是进 程 的操 作 。 不管 是那 种线 程 , 们都是 要并 但 它 发 执Байду номын сангаас 的 , 户 级线程 只 能在 自己的进程 中并 发执 行 , 用
i t no w c n s t e a u e h m u tt e di m e h im . The pa r ex ta e o t e s r t e , f c in nd s ge f he ulihr a lihr a ng c an s pe pa i t s n h t uc ur un to a u a o t m tt e d m e ha s . Fis ,i e n xa p e s h a sng V B6 nd V B. e o c l ult he r n i e f r ul ton t a ie t c nim rt tus s a e m l uc s u i .0 a n t t ac a e t u tm or acic a i O pr ctc he
维普资讯
第 2 O卷
第 1 1期
电 脑 开 发 与 应 用
文 覃 编 号 :0 3 5 5 ( 0 7 1 - 0 3 0 1 0 — 8 0 2 0 ) 10 6 — 3
Viu l ai. e 的 多线 程机 制 sa sc n t B
M u tt e di e h ni m f Vi u lBa i . t lihr a ng M c a s o s a s c ne

VB。net多线程通讯

VB。net多线程通讯

刚刚接触 使用的是VS2013 边学边做了一个考试练习软件C/S 里面包含了多线程,数据库(ACCESS)UDP和TCp 通讯。

我的想法是由于主机IP经常更换如果每次都要手动输入IP太麻烦所以想到了使用UDP 使客户端能接收到最新主机的IP 地址,实现无需手工设置设置IP就能和主机TCP连接由于是边学边做所以有很多地方可能是走了弯路的,程序只实现了一些基本功能测试是可以用了。

好了,现在进入正题,首先是服务端(客户端分开另一个文档):Public Class Form1Private udpc As New MySocke'设置一个全局UDPCPrivate threadArraylist As New ArrayList'设置一个全局数组存放线程Private userArrayList As New ArrayList'设置一个全局数组存放登陆了的用户名Private tcpArrayList As New ArrayList'连接的TCL对象Private blistener As Boolean = True'监听线程状态Private Delegate Sub voiddelegate(ByVal a As String, ByVal bian As String) '委托方法Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Me.MaximizeBox = False'最大化按钮不可用Me.FormBorderStyle = Windows.Forms.FormBorderStyle.FixedDialog'边框不可拉动 EndControl.CheckForIllegalCrossThreadCalls = FalseEnd SubPrivate Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tickudpc.UDP()End Sub''' <summary>''' 监听主线程,''' </summary>Private Sub ListenServer()Dim rizhi As New RiZhiDim arg(1) As ObjectDim tcClient As TcpClientDim msgThread As ThreadDim tlTcpListen = New TcpListener(TongxunDingYi._IPORT)Dim Service_nsStream As NetworkStream'基础Dim brWrite As BinaryWriter'以11002端口号来初始化TcpListener实例tlTcpListen.Start()arg(0) = "OK"arg(1) = ""Me.Invoke(New voiddelegate(AddressOf rizhi.star), arg)Thread.Sleep(1000)While blistener '默认是开启Thread.Sleep(30)tcClient = tlTcpListen.AcceptTcpClient()If (Not tcpArrayList.Contains(tcClient)) Then'判断连接是不是存在于数组里了 msgThread = New Thread(AddressOf MyRecvieMsg) '创建接收消息的线程msgThread.Start(tcClient)tcpArrayList.Add(tcClient)threadArraylist.Add(msgThread) '把接收到的线程放到数组里Else'发送消息提示已连接Service_nsStream = tcClient.GetStream()brWrite = New BinaryWriter(Service_nsStream)brWrite.Write("重复" & vbCrLf) '应该在什么时候断开该连接brWrite.Flush()brWrite.Close()tcClient.Close()End IfEnd WhileEnd SubPublic Sub MyRecvieMsg(ByVal Con As TcpClient)Dim mySocke As New MySocke'专门处理网络数据Dim arg(1) As ObjectDim rizhi As New RiZhiDim name As String = ""''保存名字Dim Service_nsStream As NetworkStreamDim myAccess As New MyAccessService_nsStream = Con.GetStreammySocke.SendString(Service_nsStream, "连接服务器成功!")While TrueDim sMessage As String = mySocke.GetString(Service_nsStream)Dim fg() As Stringfg = Split(sMessage, TongxunDingYi._FENGE)If Not fg(0) = TongxunDingYi._EOORE ThenSelect Case fg(0)Case TongxunDingYi._DENGLUIf Not userArrayList.Contains(fg(1)) Thenarg(0) = "0"arg(1) = fg(1) & " :登陆"name = fg(1)Me.Invoke(New voiddelegate(AddressOf rizhi.star), arg)If myAccess.Verification(fg(1), fg(2)) = 1 ThenmySocke.SendString(Service_nsStream,TongxunDingYi._DENGLU & TongxunDingYi._FENGE &"成功")userArrayList.Add(fg(1)) '添加入用户ElsemySocke.SendString(Service_nsStream,TongxunDingYi._DENGLU & TongxunDingYi._FENGE &"失败")End IfElsemySocke.SendString(Service_nsStream, TongxunDingYi._DENGLU & TongxunDingYi._FENGE &"用户在线")Service_nsStream.Close()Con.Close()Exit WhileEnd IfCase TongxunDingYi._TK '申请题库mySocke.SendString(Service_nsStream, myAccess.ShuiJiTk())Case ElseEnd SelectElseDim intle As Integer = userArrayList.IndexOf(name)Dim tcpind As Integer = tcpArrayList.IndexOf(Con)If Not intle = -1 ThenuserArrayList.RemoveAt(intle)tcpArrayList.RemoveAt(tcpind)arg(0) = "0"arg(1) = name & " :离开!"Me.Invoke(New voiddelegate(AddressOf rizhi.star), arg)End IfService_nsStream.Close()Con.Close()Exit WhileEnd IfEnd WhileEnd SubPrivate Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim startThread As ThreadstartThread = New Thread(AddressOf ListenServer)startThread.Start()Timer1.Enabled = TrueEnd SubPrivate Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) HandlesMe.FormClosingSystem.Environment.Exit(0)End SubPrivate Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click Timer1.Enabled = FalseEnd SubEnd ClassMessage类对要发送的消息进行处理Imports System.Data.OleDbPublic Class Message''' <summary>''' 对要发送的题目消息加工''' </summary>Public Function SetTK(ByVal tk As OleDbDataReader) As StringDim tkstr As Stringtkstr = TongxunDingYi._TK & TongxunDingYi._FENGE & tk(1) & TongxunDingYi._FENGE For i = 2 To 5tkstr = tkstr & tk(i) & TongxunDingYi._FENGENexttkstr = tkstr & tk(6) & TongxunDingYi._FENGE & tk(7)Return tkstrEnd FunctionEnd ClassMyAccess类对数据库操作这里我只用到查询如果要扩展还可以有其他的这个类根据系统的不同可能会出现问题,百度有解决方案,我是同时试了几次所以不确定是哪个方案解决的所以你们多试一下使用的是ACCESSImports System.Data.OleDbPublic Class MyAccess' Dim TKpath As String = Application.StartupPath & "\TK.mdb" '题库信息Dim Studentpath As String = Application.StartupPath & "\dzks.accdb"'学生信息''' <summary>''' 查询语句用户和密码返回: 0 密码错误 1验证成功''' </summary>Public Function Verification(ByVal namne As String, ByVal namepas As String) As String'题库查询If namne = ""Then'MsgBox("查询结果不能为空!", MsgBoxStyle.OkOnly, "提示")Return"0"ElseTryDim tkidstr As String = "xueshengmingzi ='" & namne & "' andxueshenpass= '" &namepas & "'"'从dzks数据库里学生基本信息表里查询Dim mySelectQuery As String = "Select xueshengdata.* from xueshengdata Where " & tkidstr' Dim sss As String = "select count(*) from TK " '查询数据总条数Dim cnstr = "provider=Microsoft.ACE.OLEDB.12.0;data source=" & Studentpath '/*定义连接字符串*/Dim cn As OleDbConnection = New OleDbConnection(cnstr) ' /*定义连接*/'定义一个OLEDB命令并实例化他' Dim cmdz As OleDbCommand = New OleDbCommand(sss, cn)Dim dr As OleDbDataReader'定义一个OLEDBReader方法来读取数据库cn.Open() '/*打开连接*/Dim cmd As OleDbCommand = New OleDbCommand(mySelectQuery, cn)' Dim dr As OleDbDataReader '定义一个OLEDBReader方法来读取数据库If cn.State = False ThenMsgBox("连接失败")Else' MsgBox("连接成功")dr = cmd.ExecuteReader() '执行OLEDB命令以ExecuteReader()方式,并返回一个OLEDBReader,赋值给dr'判断下dr中是否有数据。

VB实现多线程范文

VB实现多线程范文

VB实现多线程范文1. Visual Basic中的多线程2.什么是多线程?多线程是指操作系统中一个程序中可以容纳多个执行线程,它们共享同一个内存地址空间。

也就是说,一个程序可以有多个运行的部分,这样程序就可以执行多个任务同时。

在这种情况下,每个任务都是一个“线程”,多线程程序就是把多个线程结合在一起,可以实现同时执行多个任务。

3.VBA实现多线程的方法VBA使用ThreadPool类来实现多线程,通常使用ThreadPool.QueueUserWorkItem方法将任务提交到线程池中,该方法接收一个WaitCallback委托,该委托指定要执行的任务或函数。

另外,VBA可以使用System.Threading.Thread类来创建一个新的线程。

Thread类有两个重要的方法:Start方法用于启动线程,将在新线程中执行指定的函数;Join方法用于等待线程结束,以确保在继续执行其他操作之前,线程已完成全部任务。

4.举例实现多线程下面是一个使用VBA实现多线程的简单示例:Sub MainDim t1 As System.Threading.ThreadDim t2 As System.Threading.Thread'Create a thread to run the PrintNumbers functiont1=New System.Threading.Thread(AddressOf PrintNumbers) 'Create a thread to run the PrintText functiont2=New System.Threading.Thread(AddressOf PrintText)。

vb net线程入门详解_跨线程调用窗体控件

vb net线程入门详解_跨线程调用窗体控件

我们想实现这样一个功能:在Label1上面动态显示数字,从0~9000,我们希望看到数字的变化。

创建如下代码:Public Class Form1Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Clicktest()End SubPrivate Sub test()For i = 0 To 9000Label1.Text = i.ToStringNextEnd SubEnd Class意思就是点击按钮,进入test过程中,通过For循环,依次显示数字,真是这样吗?运行试试...不出我意料的话,最后直接显示的是9000,中间还卡了一下。

后面的0都不在了。

那么,我们要显示动态变化又怎么办呢?怎么办呢?把上面的代码修改一下,使用线程。

Imports System.Threading ’导入命名空间Public Class Form1Dim t As Thread ’定义全局线程变量Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles But ton1.Clickt = New Thread(AddressOf test) ’创建线程,使它指向test过程,注意该过程不能带有参数t.Start() ’启动线程End SubPrivate Sub test()For i = 0 To 9000Label1.Text = i.ToStringNextt.Abort()End SubEnd Class再次运行,点击确定,出错啦?什么错?如图:由于是从一个新的线程调用UI线程中窗体控件,所以这个做法很危险,你直接被拒绝了。

有一个解决办法,就是让编译器不进行跨线程检查。

在Load代码第一行加一句:CheckForIllegalCrossThreadCalls = False再次运行程序,就不会有错了,你还能看见动态变化,并且没有“假死”:如上就是线程的好处。

VBA与多线程处理的方法与示例

VBA与多线程处理的方法与示例

VBA与多线程处理的方法与示例在日常的工作中,我们经常需要处理大量的数据或执行复杂的任务。

为了提高效率和减少处理时间,使用多线程处理技术是一个不错的选择。

在VBA中,虽然没有直接支持多线程处理的功能,但我们可以借助一些技巧来实现多线程处理的效果。

本文将介绍VBA中实现多线程处理的方法,并给出一些示例,帮助读者更好地理解和应用多线程处理技术。

一、VBA中的多线程处理方法1. 使用Windows API函数Windows API函数是一组可在VBA中调用的函数,它们提供了访问操作系统的底层功能的能力。

我们可以借助Windows API函数来实现多线程处理。

下面是一个使用Windows API函数实现多线程处理的简单示例:```vbaOption ExplicitPrivate Declare PtrSafe Function CreateThread Lib "kernel32" ( _ByVal lpThreadAttributes As Any, _ByVal dwStackSize As Long, _ByVal lpStartAddress As LongPtr, _ByVal lpParameter As Any, _ByVal dwCreationFlags As Long, _ByRef lpThreadId As Long) As LongPtrPrivate Declare PtrSafe Function WaitForSingleObject Lib "kernel32" ( _ByVal hHandle As LongPtr, _ByVal dwMilliseconds As Long) As LongPrivate Declare PtrSafe Function CloseHandle Lib "kernel32" ( _ByVal hObject As LongPtr) As LongPrivate Sub DoSomething()' 在这里编写具体的处理逻辑End SubSub MultiThreadProcessing()Dim ThreadHandle As LongPtrDim ThreadID As Long' 创建线程并指定执行的函数ThreadHandle = CreateThread(0, 0, AddressOf DoSomething, 0, 0, ThreadID)' 等待线程结束WaitForSingleObject ThreadHandle, -1' 关闭线程句柄CloseHandle ThreadHandleEnd Sub```在上面的代码中,`CreateThread`函数用于创建新的线程,并指定执行的函数。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

多线程操作步骤/例程
1.定义线程
Dim Thread_Process As System.Threading.Thread()
2.定义委托函数
进程运行过程中不可直接对控件进行操作,可通过定义并构造委托函数的形式操作控件 Sub Thread_SetLVText(ByVal SetString As String, ByVal Obj As TextBox) 3.构造委托函数/过程
Sub SetLVTxt(ByVal SetString As String, ByVal Obj As TextBox)
Dim OTemp As Textbox
OTemp = Obj
OTemp.Text = SetString
End Sub
4.构造线程过程
Private Sub ExampleThreading()
…同一般过程…
End Sub
5.调用委托函数/过程
a)封装在子过程/函数中,方便调用
Sub SetLVTxt_Invoke(ByVal SetString As String, ByVal Obj As TextBox) Dim Obj_GetText As New Thread_SetLVText(AddressOf SetLVTxt)
Invoke(Obj_GetText, SetString, Obj)
End Sub
b)直接在进程过程中调用
Dim Obj_GetText As New Thread_SetLVText(AddressOf SetLVTxt)
Invoke(Obj_GetText, “abc”, TextBox1)
6.启动新线程
注意给进程赋值时”Address of”后面接线程过程名!!!
Thread_Process(i) = New System.Threading.Thread(AddressOf ExampleThreading) Thread_Process(i).SetApartmentState(Threading.ApartmentState.STA) Thread_Process(i).Start()。

相关文档
最新文档