VB.NET 在线程里用textbox,提示 线程间操作无效: 从不是创建控件“TextBox2”的线程访问它

作者&投稿:穰疫 (若有异议请与网页底部的电邮联系)
VB.NET问题 线程间操作无效~

想简单点的话不需要委托,窗体启动的时候,加上
CheckForIllegalCrossThreadCalls = False即可

背景:winform(vs2010)前台界面上有2个group(group1,group2),每个group上面有一些lable用于显示后台查询出来的数据,后台3个线程A,B,CA线程每隔几秒查询数据库,并把查询出来的数据更新到group1上的lable上(定义),B线程每隔几秒查询数据库,并把查询出来的数据更新到group2上的lable上,通过一个辅助线程计算出的一个值赋给textBox1.text;
1.直接在窗体的构造函数中添加:
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
此时禁用了所有的控件合法性检查。
2.通过代理来解决(msdn)
private delegate void SetTextCallback(string text); //在给textBox1.text赋值的地方调用以下方法即可 private void SetText(string text) { // InvokeRequired需要比较调用线程ID和创建线程ID // 如果它们不相同则返回true if (this.textBox1.InvokeRequired) { SetTextCallback d = new SetTextCallback(SetText); this.Invoke(d, new object[] { text }); } else { this.textBox1.Text = text; } }
这里主要用到了.NET中的 delegate。
另外如果线程AB只负责将数据保存在全局变量里,用一个有操作权限的C(主界面搞个timer)调用这些数据并显示在界面上就没问题了。

 比如在一个窗体中的代码如下,在另一个线程中显示,隐藏窗口线程中的进度条:  

     Public Delegate Sub VoidDelegate() '定义委托类型
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
        Dim th1 As New System.Threading.Thread(AddressOf MyThreadProc) '声明线程
        th1.Start() '启动线程运行 MyThreadProc过程
    End Sub
    Public Sub MyThreadProc() 
        Me.Invoke(New VoidDelegate(AddressOf StartProgress)) '这个是在另一个线程里调用StartProgress过程,并在创建窗口的那个线程里运行。参数是委托类型。me也可以改成控件名。如果直接调用 StartProgress,那该过程就在与MyThreadProc同一线程中运行,那么StartProgress过程中修改的控件不是在本线程创建的,就会出错。
       '。。。。。。。。。
        Me.Invoke(New VoidDelegate(AddressOf ShutProgress))
    End Sub
    Public Sub ShutProgress()
        ProgressBar1.Visible = False
   End Sub
    Public Sub StartProgress()
        ProgressBar1.Visible = True
    End Sub

'不是还有个Process控件吗,好像也是用来多线程操作的,还没研究,



在form_load事件中加上下面一句就好:
CheckForIllegalCrossThreadCalls = False '不进行跨线程检查,


淮北市18477813197: VB.NET中的多线程和委托是什么关系? 能不能给我一个通俗易懂的范例,谢谢 -
佼疮丁那: 委托,Delegate 就是让你处于这个线程里时,委托另一个线程去执行一些动作 我简单举一个写richtextbox的例子: ////////////////////////////////////////////'创建一个名为 MySubDelegate 的委托.Delegate Sub MySubDelegate(ByVal txt As String)'写信息到...

淮北市18477813197: VB.NET模糊查找文字 -
佼疮丁那: for i as integer =0 to listbox1.items.count-1 if instr(listbox1.items(i).tostring(),textbox1.text)0 then textbox2.text=listbox1.items(i).tostring() exit for end if next

淮北市18477813197: 关于vb.net中textbox初始值 -
佼疮丁那: 提示表明你的textbox未实例化,你要么直接在窗口上创建一个textbox控件textbox1,要么使用代码动态创建:dim tx as Textbox set tx=new Textbox() 大概是这个代码,未测试.这样创建之后就可以使用它了.比如 original=textbox1.text 或者 original=tx.text

淮北市18477813197: vb.net中如何在textbox中输入内容,listbox有动态内容变化 -
佼疮丁那: 在事件TextChanged中输入相关代码即可.或者你可以用ComboBox来解决这个问题,ComboBox自带ListBox.

淮北市18477813197: 请问如何用vb.net生成.txt文件,并且向里面添加内容 -
佼疮丁那: 窗体上添加2个文本框,设置成多行,2个按钮,在文本框1里随便输入若干文字,可以多行,单击按钮1,保存到文件.然后单击按钮2,把刚才写入的文件读到文本框2里. 代码如下:'写文本文件Private Sub Button1_Click(ByVal sender As ...

淮北市18477813197: 在vb.net中,多线程如何使用? -
佼疮丁那: 首先,你把你那些要运行很久的过程.尽量放在一个过程中. 因为线程只能是过程,不能使函数,没有返回值的. 然后,在某个事件下这样写: **这里我假设你的那个很就的过程叫做 sub aaa() 调用如下: Dim mythread As New System.Threading.Thread(AddressOf aaa) mythread.Start() *********** 这样就是定义一个线程,名字叫 mythread,这个线程会运行aaa这个过程. start 就是让线程运行.

淮北市18477813197: 怎样用VB.net语言实现,在textbox.text中得到数据的换行 -
佼疮丁那: 你判断一下textbox.txt中的字符串里是不是含有换行符不就行了吗?一个字符对应一个编码,如果某个字符的编码跟换行符的编码一致,那该字符就是换行符.

淮北市18477813197: 在vb.net程序中如何调用其他程序(如word等)实现对数据库中检索到的数据进行排版然后输出? -
佼疮丁那: 在引用中添加 Word 这样就能控制Word了Dim WithEvents app As Word.Application app = New Word.Application...

淮北市18477813197: vb.net2005 用一个textbox里的内容搜索数据库给ListView写资料,调用多线程 -
佼疮丁那: 你的线程是只执行一次任务的线程,不建议从其它线程强行中止,不过你的任务“搜索重新填充”是由两部份组成的 搜索 和 重新填充,所以可以在线程外设置一个控制键表示任务是否继续,每部份运行的时候先检查这个键再决定是运行还是退出,这样在任务线程执行的时候,你可以从线程外改变这个键的值,达到控制线程的目的;当然可以将任务分成更多的部份,控制就更细;其实我觉得你的问题更重要一方面是决定什么时候启动这个任务线程,比如设置一个键表示是否正有任务在执行,有的话是选择中止现有任务重新开任务还是不理会(不一定会影响体验);或者开启一个检测线程检测textbox里有焦点而多久没有输入时再启动这个任务线程

淮北市18477813197: (vb.net)我想问一下大神们,vb.net怎么将textbox里的内容写入txt类型的文件,就 -
佼疮丁那: ssss = TextBox2.Text改成:ssss.Write(TextBox2.Text) ssss.Close()

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网