+ -
当前位置:首页 → 问答吧 → VB.NET多线程界面交互问题

VB.NET多线程界面交互问题

时间:2011-12-12

来源:互联网

VB.NET编写的pocket pc程序,在开始运行到完成运行中,界面处于假死状态,其他控件无法操作。
使用多线程但提示“其他Control.Invoke 必须用于与在独立线程上创建的控件交互”
程序运行时要获取控件值并要写入信息到textbox控件
这个多线程与界面交互的问题如何解决,或者不用多线程有没其他办法解决程序在运行中,其他可以控件操作,例如暂停程序运行,或者停止运行。
多线程代码如下:
VB.NET code
  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cl_celiang.Click
  myThread = New Thread(AddressOf celiang)
            myThread.Start()
end sub

 Sub celiang()
        textbox1.Text = "目前处于自动观测模式" & vbCrLf & "请等待仪器进行自动观测"
        Threading.Thread.Sleep(2000) '延时函数
        textbox1.Text = ""
'以下略
’以下为数据读控件取数据并计算将结果输出至textbox控件
end sub

作者: hao8986   发布时间: 2011-12-12

多线程中不能直接访问ui控件,你用invoke调用委托函数,
或者简单点,在sub Main函数里加上下面这句代码,线程里就可以访问ui控件了

sub Main()
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls=False...
end sub

作者: gxingmin   发布时间: 2011-12-12

引用 1 楼 gxingmin 的回复:

多线程中不能直接访问ui控件,你用invoke调用委托函数,
或者简单点,在sub Main函数里加上下面这句代码,线程里就可以访问ui控件了

sub Main()
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls=False...
end sub

用Invoke也很简单
VB.NET code
Public Delegate Sub ChangeTextDelegate(tb As TextBox,Conetnt As String);

Public Sub ChangeTextInvoke(tb As TextBox,Conetnt As String)
{
  tb.Text = Conetnt;
}

textbox1.Invoke(new ChangeTextDelegate(Addressof ChangeTextInvoke),new object(){textbox1,"目前处于自动观测模式" & vbCrLf & "请等待仪器进行自动观测"})


作者: bunliney   发布时间: 2011-12-12

引用 2 楼 bunliney 的回复:

引用 1 楼 gxingmin 的回复:

多线程中不能直接访问ui控件,你用invoke调用委托函数,
或者简单点,在sub Main函数里加上下面这句代码,线程里就可以访问ui控件了

sub Main()
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls=False...
end sub

用Invo……


+1
用委托吧,当然1楼的代码也行,不过很偷懒的说.

作者: xiaolinyouni   发布时间: 2011-12-13

引用 1 楼 gxingmin 的回复:
多线程中不能直接访问ui控件,你用invoke调用委托函数,
或者简单点,在sub Main函数里加上下面这句代码,线程里就可以访问ui控件了

sub Main()
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls=False...
end sub


提示错误 2 “CheckForIllegalCrossThreadCalls”不是“System.Windows.Forms.TextBox”的成员。
invoke我还没测试,如果用invoke调用委托函数每个textbox都必须进行委托?获取textbox控件值也可以吗?
我的界面中有好几个textbox控件,功能是:通过串口通讯获取数据显示到其中几个textbox控件中,再获取这几个textbox控件的值通过计算,计算结果输出到另一个textbox控件中。

作者: hao8986   发布时间: 2011-12-13

为什么要把CheckForIllegalCrossThreadCalls加到TextBox上?

CheckForIllegalCrossThreadCalls是Control类的静态属性,直接写下面这句代码就行了
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls=False

作者: gxingmin   发布时间: 2011-12-13

引用 5 楼 gxingmin 的回复:
为什么要把CheckForIllegalCrossThreadCalls加到TextBox上?

CheckForIllegalCrossThreadCalls是Control类的静态属性,直接写下面这句代码就行了
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls=False


错误 1 “CheckForIllegalCrossThreadCalls”不是“System.Windows.Forms.Control”的成员。

作者: hao8986   发布时间: 2011-12-13