×

vb.net中使用多线程

Kalet Kalet 发表于2016-12-28 13:53:45 浏览208 评论0

抢沙发发表评论

~在对POS机上的销售系统进行了再次修改之后,又对这个系统进行充分而有详细的考虑。主要是对健壮性方面,要考虑到所有可能出现的问题。
昨天坤哥提出了一中出错的可能,就是如果说要进行打印的话没有纸了,或者是纸不够了怎么办?
按照我们这个程序的设计来说,这时候会程序会进入等待状态,这意味着现在无法进行任何操作,如果时间过于长的话,这时候可能会导致程序意外崩溃,虽然进过测试我们的程序不会崩溃,但是如果长时间的无法操作并且也没有提示的话那是一件十分不美好的事情。
因此,这是按照逻辑应该有一个提示 “正在进行远程打印请稍等……”。但是这个提示怎么弹出来?因为开始时候没有考虑多线程,在进行打印时肯定是打印的这段代码已经独占了整个进程了,也就是无法再执行别的代码了,别的代码是指在本销售系统中的另外的代码。这时候程序将会出现假死。其他的代码段根本就得不到执行。
所以考虑使用多线程。于是乎就研究了一下多线程。下面来看实例:
新建工程如下:
clip_image002
      然后在窗体中添加代码:
[vb] view plain copy
Imports System.Threading 
Public Class Form1 
    Dim runThread As Thread 
    Dim i As Double 
    Dim str As String 
    Private Sub bntRun_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bntRun.Click 
        run() 
    End Sub 
    Private Sub run() 
        While True 
            str = "正在运行多线程" 
            i = i + 1.345 
            i = i * 1.23425 
            i = i / 1.23425 
            i = i - 1.345 
        End While 
    End Sub 
    Private Sub btnThread_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnThread.Click 
        runThread = New Thread(AddressOf run) 
        runThread.Start() 
        Me.Text = i.ToString 
    End Sub 
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
        MsgBox("程序拥挤吗?现在i变成了:" + i.ToString) 
    End Sub 
    Private Sub btnStop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStop.Click 
        runThread.Abort() 
        str = "线程结束" 
    End Sub 
    Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing 
        If runThread.IsAlive Then 
            runThread.Abort() 
        End If 
    End Sub 
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
    End Sub 
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick 
        Me.Text = str + i.ToString 
    End Sub 
End Class 
别的不说了,自己看代码吧,然后看一下效果:
先看单线程的:
clip_image004
 clip_image006
只有关闭程序才能解决问题。
再来看多线程:
clip_image008
clip_image010
点击停止多线程,才可以停止,不然的话你关闭程序了依然会有一个线程在玩耍。这可不好玩。

群贤毕至

访客