Invoke的问题,折磨一天了也没找到解决办法

BATTLERxANGE 2009-07-31 11:02:30
窗体:
Imports System.Threading
Public Class form1
Delegate Sub SetText()
Dim x As New Class1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim a As New Thread(AddressOf TEXT2)
a.Start()
End Sub
Public Sub TEXT2()
Me.Invoke(New SetText(AddressOf x.text3))
End Sub
End Class

类:

Public Class Class1
Public Sub text3()
form1.Text = "123"
End Sub
End Class

上面的代码没有问题
但是看下面的代码:
窗体:

Imports System.Threading
Public Class form1
Delegate Sub SetText()
Dim x As New Class1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim a As New Thread(AddressOf x.TEXT2)
a.Start()
End Sub
End Class

类:

Imports System.Threading
Public Class Class1
Public Sub text3()
form1.Text = "123"
End Sub
Public Sub TEXT2()
form1.Invoke(New form1.SetText(AddressOf text3))’异常:在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke
End Sub
End Class

我将线程移到了类中,然后线程调用委托Invoke,结果出现异常“在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke”找遍了资料也没找到什么解决办法,哎,请达人解答一下!!!
...全文
1147 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
greatbody 2012-08-02
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

谢谢,终于搞定了,要把FORM1也传过去才可以
TOOTTO你的会死循环
这个问题的原因应该是跨类无法访问FORM窗体吧?如果需要访问就必须传递对象?
我的一个C/S程序为了代码更直观是这样的一个设计思路的:
线程还是在窗体代码里面,负责收包与发包,收到数据包以后就把数据包扔到类中的一个过程去处理包,感觉这样代码看起来比较清爽
但是后来发现类中的包处理过程处理完以后,无法刷新界面,使用……
[/Quote]
请问,如何把Form传递到类中?请帮忙谢谢!
ddlik 2009-08-01
  • 打赏
  • 举报
回复
vb窗口

dim x as class1
...


x= New class1(Me)


vb class

public sub new(byval passForm1 as form1)
...


BATTLERxANGE 2009-08-01
  • 打赏
  • 举报
回复
现在的一个新问题是,调用一个对象就需要传递一个对象,但如果我一次要调用很多对象,那不是超麻烦?全部都需要传递!?
CanDy_O 2009-08-01
  • 打赏
  • 举报
回复
谢谢啦!
是用类的构造函数NEW来传吧
BATTLERxANGE 2009-08-01
  • 打赏
  • 举报
回复
你把对象也传递过去就可以了~~~
然后
对象.Invoke(New 委托名(AddressOf 过程))
CanDy_O 2009-08-01
  • 打赏
  • 举报
回复

楼主把正确的代码发下啊,我也遇到类似的问题,苦恼。。
BATTLERxANGE 2009-08-01
  • 打赏
  • 举报
回复
谢谢,终于搞定了,要把FORM1也传过去才可以
TOOTTO你的会死循环
这个问题的原因应该是跨类无法访问FORM窗体吧?如果需要访问就必须传递对象?
我的一个C/S程序为了代码更直观是这样的一个设计思路的:
线程还是在窗体代码里面,负责收包与发包,收到数据包以后就把数据包扔到类中的一个过程去处理包,感觉这样代码看起来比较清爽
但是后来发现类中的包处理过程处理完以后,无法刷新界面,使用了委托也不行,所以就碰到了一个这样的问题,现在解决了,呵呵,感谢!但是每次都将FORM1传递过去还真麻烦^-^
BATTLERxANGE 2009-08-01
  • 打赏
  • 举报
回复
谢谢,问题彻底解决了!
tootto 2009-08-01
  • 打赏
  • 举报
回复
没看清楚你的线程是在另外一个类里创建的。把this替换成form1吧。

不过很奇怪form1怎么另外一个类里? 程序结构有点乱。
tootto 2009-08-01
  • 打赏
  • 举报
回复
你的代码:
Imports System.Threading

Public Class Class1
Public Sub text3() form1.Text = "123"
End Sub

Public Sub TEXT2()
WaitFormHandler()//放到这里
form1.Invoke(New form1.SetText(AddressOf text3))’异常:在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke
End Sub

End Class

你把C#代码转成VB代码就行了,应该很容易,很简单的逻辑.
tootto 2009-08-01
  • 打赏
  • 举报
回复
建一个function等待win form 窗体的handler的建立:

private void WaitFormHandler()
{
while (true)
{
if (this.IsHandleCreated) //这里this是YourForm1
{
break;
}
}
}

然后把这个方法放到Invoke之前.
cpp2017 2009-07-31
  • 打赏
  • 举报
回复
你把form1传到类中试试看?
BATTLERxANGE 2009-07-31
  • 打赏
  • 举报
回复
谢谢LS的回复,这个我知道呢!而且也可以正常的跨线程操作UI界面,但这是建立在“执行Invoke委托的线程在窗体中”的基础上的!
你看我后面的代码
如果我将执行Invoke委托的线程移到类中,就会出现那个异常!
cpp2017 2009-07-31
  • 打赏
  • 举报
回复
http://msdn.microsoft.com/zh-cn/vstudio/ms171728.aspx

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧