vb.net/C外部处理程序
我有一个表单,用于显示有关流程的选项。 应用选项时: frmOptions 在工具模块中: 而且。。。messagebox显示其消息,但颜色不变。 经过一些尝试后,问题是当处理程序激活了\u目标\u进程\u已\u退出时 如果我这样做,按钮1属于frmAET,如btnStatus:vb.net/C外部处理程序,vb.net,handler,Vb.net,Handler,我有一个表单,用于显示有关流程的选项。 应用选项时: frmOptions 在工具模块中: 而且。。。messagebox显示其消息,但颜色不变。 经过一些尝试后,问题是当处理程序激活了\u目标\u进程\u已\u退出时 如果我这样做,按钮1属于frmAET,如btnStatus: Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click a_target_process_ha
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
a_target_process_has_been_exited()
End Sub
它起作用了!但不是当我真的想要一个过程结束的时候。
因此,问题是进程结束事件何时调用子进程
当我试图指定这一点时,也许frmAET的sub可以修改其控件:
AddHandler leproc.Exited, AddressOf frmAET.a_target_process_has_been_exited
错误:对非共享成员的引用需要objet引用
您能帮助我吗?您的AddHandler似乎使用了frmAET的地址。a\u target\u process\u已退出,这意味着frmAET表单中的方法本身。不是你说的工具模块
让我们考虑一下你的FrMeOpple是正确的,FrMAET包含了删除的FRMAET的明确引用,因为它是局部的< /P>
Public Sub a_target_process_has_been_exited(sender As Object, e As EventArgs)
btnStatus.ForeColor = Color.Red
MsgBox("OK")
End Sub
正如前面的注释所解释的,您的事件处理程序在另一个线程中被调用,您需要将自己同步到主UI线程。例如:
Public Sub a_target_process_has_been_exited(sender As Object, e As EventArgs)
Me.BeginInvoke(Sub() HandleProcessExit())
End Sub
Public Sub HandleProcessExit
btnStatus.ForeColor = Color.Red
MsgBox("OK")
End Sub
此版本将阻止主UI线程,直到您单击MsgBox按钮
您应该添加一些Try/Catch块。其他线程中的异常很难检测到
此代码依赖于VB.NET为您创建的隐式表单实例。我希望您的frmAET实际上是My.Forms.frmAET实例,以便执行此操作。退出的事件是在UI线程以外的线程中引发的。您需要在UI线程中启动控件,或使用设置对象。它可以是包含按钮委托的表单,用于封送事件处理程序调用回UI线程。但是,此处的frmAET引用未知。事件处理程序应该在frmOptions中,在尝试更改其任何控件属性之前,会检查frmAET是否存在。@Jimi谢谢。我尝试了很多事情,但都不可能成功。我有两个表单frmAET&frmOptions和一个模块,我在frmOption中使用addhandler,但当应用选项时,此表单是关闭的。frmAET是始终可见的主要形式。但是,由于我需要以不再存在的形式使用addhandler,所以我必须指定模块sub的AddressOf,而不能使用AddressOf frmAET.sub。由于模块是子模块,我想修改frmAET.btnStatus.ForeColor,感谢您的帮助:然后在模块中创建流程,这样您就可以使其保持活动状态,直到退出。记住。如果不为null,请在退出事件中处理它。@Jimi Done!`AddHandler进程已退出,目标进程的地址已退出进程SynchronizingObject=frmAET proc.EnableRaisingEvents=True`非常感谢!谢谢,这个很好用!我的问题是我的语法正确。BeginInvokeSub HandleProcessExit谢谢@UserNam3:如果这个答案解决了您的问题,请按帖子左侧的勾号/复选标记将其标记为已接受。这一点很重要,因为它既奖励回答者帮助您,也向其他人表明问题已经解决。有关更多信息,请参阅:@VisualIncent Done
Public Sub a_target_process_has_been_exited(sender As Object, e As EventArgs)
btnStatus.ForeColor = Color.Red
MsgBox("OK")
End Sub
Public Sub a_target_process_has_been_exited(sender As Object, e As EventArgs)
Me.BeginInvoke(Sub() HandleProcessExit())
End Sub
Public Sub HandleProcessExit
btnStatus.ForeColor = Color.Red
MsgBox("OK")
End Sub