vb2012文本框背景色不使用线程改变 [英] vb2012 textbox backcolor does't change using thread

查看:16
本文介绍了vb2012文本框背景色不使用线程改变的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我写了非常简单的线程示例.

I wrote very simple thread example.

  1. 制作普通的form1并删除1个文本框
  2. 在表单加载时运行线程工作
  3. 线程更改文本框背景颜色看起来像打开/关闭

但是,它不起作用.....

But, it doesn't work.....

你能告诉我为什么不工作吗??

Can you tell me why doesn't work??

查看我的来源.

=======================================================================

=====================================================================

Imports System.Threading

Public Class Monitor
    Public wObj As Worker = New Worker()
    Public MyThread As Thread = New Thread(AddressOf wObj.DoWork)

    Public Sub ChangeTBColor(pOption As Integer)
        If pOption = 1 Then
            tb1.BackColor = Color.Aqua
        Else
            tb1.BackColor = Color.Red
        End If
    End Sub



    Private Sub Monitor_Load(sender As Object, e As EventArgs) Handles Me.Load

        MyThread.Start()

        Console.WriteLine("Running OrgThread..")

        Console.WriteLine("Stop running")

    End Sub

    Private Sub BtnThreadStop_Click(sender As Object, e As EventArgs) Handles BtnThreadStop.Click

        Me.wObj.RequestStop()
    End Sub

End Class


Public Class Worker
    Private LoopStop As Boolean = True
    Public Sub DoWork()
        Console.WriteLine("User Thread Start!")
        Dim iTemp As Integer = 0

        While (LoopStop)

            Monitor.ChangeTBColor(iTemp Mod 2)

            iTemp = iTemp + 1

            Thread.Sleep(500)

        End While

        Console.WriteLine("User Thread End.!")
    End Sub

    Public Sub RequestStop()
        LoopStop = False
    End Sub
End Class

推荐答案

如前所述,您为工作启动了一个新线程,问题是您试图更改需要调用的控件的颜色.话虽如此,当需要调用控件时,我们需要一个委托......在我的示例中,我使用了一个类来处理这一切并且效果很好.另外请确保导入 System.ComponentModel 因为这是 BackgroundWorker 所需要的...我使用了后台工作程序,因为它可以减轻您需要的所有繁重工作...

As already mentioned, your starting a new thread for your work, the issue is your trying to change the color for a control that need invoking. With this said, we need a delegate for when the control needs to be invoked... In my example, I used one class that handles this all and works great. Also please make sure to import System.ComponentModel because this is needed for the BackgroundWorker... I used the background worker as it takes all the heavy lifting off you would need...

Imports System.ComponentModel
Imports System.Threading

Public Class Monitor
Delegate Sub SetColor(ByVal clr As Integer) 'Your delegate..
Private WithEvents bw As New BackgroundWorker

Public Sub ChangeTBColor(pOption As Integer)
    If Me.tb1.InvokeRequired Then 'Invoke if required...
        Dim d As New SetColor(AddressOf ChangeTBColor) 'Your delegate...
        Me.Invoke(d, New Object() {pOption})
    Else
        If pOption = 1 Then
            tb1.BackColor = Color.Aqua
        Else
            tb1.BackColor = Color.Red
        End If
    End If


End Sub

Private Sub Monitor_Load(sender As Object, e As EventArgs) Handles Me.Load
    bw.WorkerSupportsCancellation = True
    Console.WriteLine("Running OrgThread..")
    bw.RunWorkerAsync()

End Sub

Private Sub bw_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles bw.DoWork
    Dim iTemp As Integer = 0
    Dim LoopStop As Boolean = True
    Console.WriteLine("User Thread Start!")

    While (LoopStop)
        If Not (bw.CancellationPending) Then
            ChangeTBColor(iTemp Mod 2)
            iTemp = iTemp + 1
            Thread.Sleep(500)
        Else
            e.Cancel = True
            LoopStop = False
        End If
    End While

End Sub

Private Sub bw_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles bw.RunWorkerCompleted
    Console.WriteLine("User Thread End.!")
End Sub

Private Sub BtnThreadStop_Click(sender As Object, e As EventArgs) Handles BtnThreadStop.Click
    If bw.IsBusy Then
        bw.CancelAsync()
    Else
        Console.WriteLine("Running OrgThread..")
        bw.RunWorkerAsync()
    End If
End Sub

End Class

这是我的测试截图...这是经过试验和测试的.如果这对您有帮助,请务必投票!

这篇关于vb2012文本框背景色不使用线程改变的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆