创建的窗体还在,为什么IsHandleCreated就false了??

bigbillybear 2019-02-15 10:55:11
广大同志们春节快乐,请教个问题,我通过form1启动form2,form2建立后,手动启动子线程循环接收网络数据并通过BeginInvoke在form2控件上显示数据,为什么跑着跑着form2的IsHandleCreated就变false了???提示创建窗体句柄前不能调用BeginInvoke方法了??除了接收数据并显示,我没有任何操作,问题出现的时间也不固定??请问这是什么机制,自动销毁了窗体句柄吗??



If IsHandleCreated Then
BeginInvoke(dmsg, mstr)
Else
Console.WriteLine("lost Handle" + Format(Now, "MM-dd HH:mm:ss"))
End If



其中dmsg是委托的修改form2窗体显示过程,mstr是接收到的数据
...全文
2754 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
bigbillybear 2019-03-29
  • 打赏
  • 举报
回复
引用 6 楼 圣殿骑士18 的回复:
为什么使用模态窗体就没问题?我猜测正是由于模态窗体的执行特点是,打开form2后,form1中的后续代码是不会执行的,也就是后续的错误代码没有被执行,当然不会出错了。
而你不用模态窗体的话,在打开form2之后,的代码继续执行,执行到错误的代码上,把form2销毁了。

至于你说的肉眼可见,这个,还是匪夷所思,可能另有说法。版主说的查看windows日志,这要看你出现错误后,应用有没有崩溃?没崩溃那日志里是看不到什么的。看你贴的代码,并没有崩溃,你只是使用Console将错误输出而已。


==========


经过测试,无论用模态还是非模态窗体,都会报这个问题,但是我在问题出现前后都打印了窗体的句柄form2.handle,发现窗体句柄并没有发生变化。
而且通过form2上传输控制按键,命令设备停止发送,然后再启动发送,系统又可以正常接收数据了,说明窗体没有崩溃。实在分析不清,我准备判断IsHandleCreated,然后关闭接收子线程,再用一个定时器控制停止测量和启动测量过程。
PS,这个应该和数据传输本身没有关系,因为在form2的接收子线程里,数据接收一直是正常的。
bigbillybear 2019-02-25
  • 打赏
  • 举报
回复
最近两天的测试,使用form.show,也意外的没有报错


之前Form1作为主控窗体打开了一些其他窗体进行参数设置,因为偷懒,这些窗体在关闭时,我重写窗体FormClosing事件,只是隐藏了没有真的释放掉


Me.Visible = False
e.Cancel = True


现在我关闭窗体时都是真实关闭了,不知道这个问题与这个应用场景有没有关系。。。。。暂时没有出现这个问题,我会再反复测试这个问题
bigbillybear 2019-02-25
  • 打赏
  • 举报
回复
引用 12 楼 良朋 的回复:
你的代码中是没必要判断IsHandleCreated的


原本代码里是没有判断的,直到遇到这个错误,所以只是加上看看是不是这个问题


良朋 2019-02-22
  • 打赏
  • 举报
回复
你的代码中是没必要判断IsHandleCreated的
良朋 2019-02-22
  • 打赏
  • 举报
回复
form的load事件中判断控件的IsHandleCreated属性,确实是为False,这没什么问题啊!
比如ComboBox的Selected事件在form load后总是自动执行,如果你不想让它执行,可以通过判断该控件的IsHandleCreated属性来限制。
bigbillybear 2019-02-21
  • 打赏
  • 举报
回复
网上很多解释都是form2被关闭再打开后出错,因为form2里注册的一些过程没有被注销,在form2.close过程中没有自动注销这些过程,需要手动释放,但是我的问题是我没有做任何操作,数据是一直采集突然就出错了,现在改成模态窗体后没有再出错,我准备改成非模态再试试,看看问题会不会重现,测试后再和大家汇报结果
bigbillybear 2019-02-21
  • 打赏
  • 举报
回复
引用 6 楼 圣殿骑士18 的回复:
建议你贴出打开form2的这部分代码。

为什么使用模态窗体就没问题?我猜测正是由于模态窗体的执行特点是,打开form2后,form1中的后续代码是不会执行的,也就是后续的错误代码没有被执行,当然不会出错了。
而你不用模态窗体的话,在打开form2之后,的代码继续执行,执行到错误的代码上,把form2销毁了。

至于你说的肉眼可见,这个,还是匪夷所思,可能另有说法。版主说的查看windows日志,这要看你出现错误后,应用有没有崩溃?没崩溃那日志里是看不到什么的。看你贴的代码,并没有崩溃,你只是使用Console将错误输出而已。


FORM1就是一个统一启动的界面,应该不会有错误代码产生,通过form1的菜单我可以打开form3设置需要监听的网口并等待客户端连进来,完成mTcpListener和mTcpClient实例化,执行mTcpClient = mTcpListener.AcceptTcpClient,这两个对象都是在module里定义的public对象,所以在form2里也能用。然后再打开form2接收数据并绘制实时曲线

因为我先判断了IsHandleCreated 再使用invoke,所以不会崩溃,不然还是会崩的。

form1打开窗体的代码还是很简单的,就是form2.show,现在改成form2.showdialog
bigbillybear 2019-02-19
  • 打赏
  • 举报
回复
引用 2 楼 exception1992 的回复:
最好有日志记录或者看windows日志


请问如何查看Windows日志关于我代码的事件记录??以前还真没用过这个方法
bigbillybear 2019-02-19
  • 打赏
  • 举报
回复
引用 3 楼 圣殿骑士18 的回复:
好神奇。。。。应该你代码有bug,把form2窗体关了。


form2肉眼可见还在,而且跟踪代码还可以看到,form2里的网络数据接收代码还在正常跑,最近改成模态窗体后,还没有报过错误
exception92 2019-02-19
  • 打赏
  • 举报
回复
引用 5 楼 bigbillybear 的回复:
[quote=引用 2 楼 exception1992 的回复:]
最好有日志记录或者看windows日志


请问如何查看Windows日志关于我代码的事件记录??以前还真没用过这个方法[/quote]
https://blog.csdn.net/xCnhYKoHj3eK/article/details/78976145
  • 打赏
  • 举报
回复
该不会你两个地方的对象不是一个对象吧?
圣殿骑士18 2019-02-19
  • 打赏
  • 举报
回复
建议你贴出打开form2的这部分代码。

为什么使用模态窗体就没问题?我猜测正是由于模态窗体的执行特点是,打开form2后,form1中的后续代码是不会执行的,也就是后续的错误代码没有被执行,当然不会出错了。
而你不用模态窗体的话,在打开form2之后,的代码继续执行,执行到错误的代码上,把form2销毁了。

至于你说的肉眼可见,这个,还是匪夷所思,可能另有说法。版主说的查看windows日志,这要看你出现错误后,应用有没有崩溃?没崩溃那日志里是看不到什么的。看你贴的代码,并没有崩溃,你只是使用Console将错误输出而已。


==========
欢迎关注微信公众号 “产品技术知与行” ,打造全面的结构化知识库,包括原创文章、免费课程(C#,Java,Js)、技术专题、视野知识、源码下载等内容。
最新文章:多种Timer的场景应用 https://mp.weixin.qq.com/s/TJKi7PBj3nznf9FClirXUA
exception92 2019-02-18
  • 打赏
  • 举报
回复
最好有日志记录或者看windows日志
bigbillybear 2019-02-18
  • 打赏
  • 举报
回复
没有人遇见类似问题吗??上一个版本测试打开窗体使用showdialog打开form2,跑了一周末没有报错,不知道有没有关系
圣殿骑士18 2019-02-18
  • 打赏
  • 举报
回复
好神奇。。。。应该你代码有bug,把form2窗体关了。

16,555

社区成员

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

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