函数执行时间过长,导致Winform界面无响应
具体代码:publicdelegatevoidybb();privatevoidsp_DataReceived(objectsender,System.IO.Ports....
具体代码:
public delegate void ybb();
private void sp_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
ybb ybb2 = new ybb(ybb1);
BeginInvoke(ybb2);
}
public void ybb1()
{
try
{
int ili = sp.BytesToRead;
byte[] s = new byte[ili];
sp.Read(s, 0, s.Length);
ckbind(s);
}
catch
{ }
}
当数据量过大时函数 ckbind(s)执行的时间有点儿长,导致Winform界面瞬间就无响应了,有什么办法解决啊?
请各位大哥大姐帮帮忙啊! 展开
public delegate void ybb();
private void sp_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
ybb ybb2 = new ybb(ybb1);
BeginInvoke(ybb2);
}
public void ybb1()
{
try
{
int ili = sp.BytesToRead;
byte[] s = new byte[ili];
sp.Read(s, 0, s.Length);
ckbind(s);
}
catch
{ }
}
当数据量过大时函数 ckbind(s)执行的时间有点儿长,导致Winform界面瞬间就无响应了,有什么办法解决啊?
请各位大哥大姐帮帮忙啊! 展开
5个回答
展开全部
有两种简单地方法可以解决这个问题。
1.使用多线程,把ckbind处理放到子线程里,就不会影响主窗体响应系统事件了,也就不会无响应了,有心的话,还可以做成主窗体不可用,再来个进度条,让人一看就知道在执行一个很长的处理,而且程序还在运行中。
2.在ckbind里如果是循环导致的事件过长,可以在循环固定次数时,调用Application.DoEvent();方法,使程序响应一次系统事件,虽然看不出程序动,但是肯定不会无响应,因为系统判定无响应是只一定时间内,程序不能响应系统事件,所以在这个时间到达之前响应一次,就不会有无响应的问题了。
1.使用多线程,把ckbind处理放到子线程里,就不会影响主窗体响应系统事件了,也就不会无响应了,有心的话,还可以做成主窗体不可用,再来个进度条,让人一看就知道在执行一个很长的处理,而且程序还在运行中。
2.在ckbind里如果是循环导致的事件过长,可以在循环固定次数时,调用Application.DoEvent();方法,使程序响应一次系统事件,虽然看不出程序动,但是肯定不会无响应,因为系统判定无响应是只一定时间内,程序不能响应系统事件,所以在这个时间到达之前响应一次,就不会有无响应的问题了。
展开全部
强制关机,就是一直按着主机上的开机键。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
sp_DataReceived是在非界面线程中运行的吧。
将ckbind的部分也放在后台线程,不要太早调用BeginInvoke将调用转换至界面纯种。仅在需要设置界面的时候调用BeginInvoke或是Invoke
将ckbind的部分也放在后台线程,不要太早调用BeginInvoke将调用转换至界面纯种。仅在需要设置界面的时候调用BeginInvoke或是Invoke
更多追问追答
追问
sp_DataReceived是窗口上的SerialPort串口组件的事件
ckbind函数:
public delegate void CKBind(byte[] by);
public void ckbind(byte[] by)
{
if (flowLayoutPanel1.InvokeRequired)
{
CKBind d = new CKBind(ckbind);
Invoke(d, by);
}
else
{
try
{...
追答
没用过SerialPort控件,估计sp_DataReceived有可能在界面线程中触发的。如是你确定知道ckbind太耗时间的话那把你的else后的那部分代码也贴一下看看。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
用异步+委托
异步执行函数,完成时调用委托通知UI。UI响应完成事件。
异步执行函数,完成时调用委托通知UI。UI响应完成事件。
追问
我要在函数ckbind(s)中对收到的字符串进行分析,然后向flowLayoutPanel中添加UserControl控件来显示结果,还有一些其他地方的数据绑定等,该怎么完成您说的“函数完成时调用委托通知UI。UI响应完成事件”这一过程啊,您能介绍详细一点儿吗
追答
你分析一下你的整体过程,将相应的操作整理出来。
哪些可以异步,哪些可以同步。
我简单的来说一下:字符串解析可以异步去做,添加UserControl这个只能同步,数据绑定的更新也只能同步。
简单点来说就是让你利用多线程去做
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
在运行结束时,将对象删除,不太确定,学的是C
来自:求助得到的回答
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询