Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
vb.net/C外部处理程序_Vb.net_Handler - Fatal编程技术网

vb.net/C外部处理程序

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

我有一个表单,用于显示有关流程的选项。 应用选项时:

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_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