【求救】程序硬直假死,这种情况能做个进度条么?

OROCHIORI513 2009-12-23 06:19:01
这是一个OPC客户端程序 我的“连接”按钮的CLICK事件中写了连接OPC服务器的一些代码.以下是核心代码

private void button1_Click(object sender, EventArgs e)
{
....省略几行些连接服务器和创建组的
for (int i = 1; i <= pointCount; i++)
{
ClientHandles[i] = i;
}

for (int i = 1; i <= pointCount; i++)
{
Retstr[i] = _pointID2[i - 1].ToString();
}
TheOPCitems.AddItems(pointCount, ref arrRetstr, ref arrClientHandles, out arrServerHandles, out arrErrors, null, null);

for (int i = 1; i <= pointCount; i++)
{
oitem[i] = TheOPCitems.GetOPCItem(Convert.ToInt32(arrServerHandles.GetValue(i)));
oitem[i].IsActive = true;
}
}

OPC服务器端点值有变化时就执行一下DataChange事件,第一次连接的时候(也就是点击“连接”按钮的时候),也会自动执行一下DataChange事件。为了提高速度,我在dataChange事件里面设置了一下,让它第一次运行的时候不要执行datachange事件(用变量First) datachange事件如下

void DataChange(xxx,fff,ddd,zzz...)
{
if (First== 1)
{
return;
}
..
...
...
}

以前DataChange事件里面代码少的时候,点击“连接”按钮时很快就能连上,但现在Datachange里面代码多了,点击“连接”按钮的时候(既第一次运行),程序居然硬直了近两分钟。我就纳闷了,既然第一次连接已经return啦 并没有执行下面的代码 速度为啥会慢呢?不明原因(我猜想..是我之前数组定义的太多了,datachange事件里面用到了许许多多在Form1_Load里面从数据库中提出来的数组,所以速度会变慢,虽然没有去执行,但系统会去做一个“提前准备”,方便之后使用...只是猜想 实在想不出别的原因)..
我逐行断点测试过 当执行完button1_Click以后,程序就硬直两分钟,两分钟后调试位置跑到DataChange事件中.

既然这种情况很难改变了,那我干脆就做一个进度条算了,启动的时候有进度条在的话客户好歹还是能接受的。但现在问题是进度条放上面了 也会随着程序的硬直而硬直,都一起“假死”掉了。
我的问题是 用多线程或者什么方法,能不能实现这个进度条的功能。我对多线程不咋了解,很害怕多线程也无法解决这个问题。
希望高手能指点下。
感激不尽!! 感激不尽!!!!!
...全文
229 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jave.Lin 2009-12-24
  • 打赏
  • 举报
回复
最简单的多线程:

new Thread(new ThreadStart(method)).Start();

private void method();//你所有的开始操作

这样就可以和你的主调用线程分离出另一个子线程去执行了。

就算这个子线程阻塞中,主调用线程也不会影响。

从而避免假死状态(主调用线程的阻塞状态)。
OROCHIORI 2009-12-24
  • 打赏
  • 举报
回复
结贴了 谢谢各位!!整理下思路再发帖 感谢!!!
OROCHIORI 2009-12-24
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 alifriend 的回复:]
进度条假滚,就是从0滚到100,然后再从头滚

当查询完成时,通知这个线程去死
[/Quote]
好办法..我在家里的机器硬直3分钟 公司的机器硬直2分钟 应该是内存决定的吧
我现在首先要解决的一个问题就是 让硬直的窗体不再硬直(在画面上可以操作一些上面按钮什么的)
貌似很难做到这一点..看来重点应该转移到另一个窗体上了
波导终结者 2009-12-24
  • 打赏
  • 举报
回复
进度条假滚,就是从0滚到100,然后再从头滚

当查询完成时,通知这个线程去死
OROCHIORI 2009-12-24
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 alifriend 的回复:]
再开一个线程,弄个窗体放进度条,我的工程里就是这样弄的,报表查询数据库,有时候会比较久,又不知道确切时间,就弄个窗体盖在上面滚进度条
[/Quote]
不知道确切时间的情况下 你的进度条是根据什么条件知道操作完成的?
波导终结者 2009-12-24
  • 打赏
  • 举报
回复
再开一个线程,弄个窗体放进度条,我的工程里就是这样弄的,报表查询数据库,有时候会比较久,又不知道确切时间,就弄个窗体盖在上面滚进度条
xuetianliang 2009-12-24
  • 打赏
  • 举报
回复
//---------------
//在程序中添加progressBar1控件,并且引用using System.Threading

/// <summary>
/// 控件工作委托
/// </summary>
delegate void Work();
/// <summary>
/// 线程
/// </summary>
Thread td;
/// <summary>
/// 线程运行方法(完成功能:死循环处理特定控件)
/// </summary>
public void RunThread()
{
//建立控件委托
Work OnWork = new Work(this.ProcessBarWork);
while (true)
{
//直接委托方法
progressBar1.Invoke(OnWork);
System.Threading.Thread.Sleep(100);
}
}
/// <summary>
/// 进度条Value赋值方法
/// </summary>
private void ProcessBarWork()
{
if (progressBar1.Value >= 100)
{
progressBar1.Value = 0;
}
++progressBar1.Value;
}


//在button1_Click添加下面代码---------------
//td = new Thread(new ThreadStart(this.RunThread));
//td.Start();
//---------------

//使用完成后使用td.Abort()结束进程
OROCHIORI 2009-12-24
  • 打赏
  • 举报
回复
额..最后UP一次 整理下思路重新发帖
OROCHIORI549 2009-12-24
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 libinguest 的回复:]
C# codedelegatevoid HandleInterfaceUpdateDelegate();//委托,此为重点 HandleInterfaceUpdateDelegate interfaceUpdateHandle;
Thread td;public formMain()
{
InitializeComponent();
interfaceUpdateHandle=new HandleInterfaceUpdateDelegate(StartPro);//实例化委托对象 }


在你进行操作的方法里第一句加上:this.Invoke(interfaceUpdateHandle);//用指定的参数列表执行指定的委托
最后一行加上:
td.Abort();


这是相关的方法。privatevoid chang()
{
ProcessBar obj=new ProcessBar();注:ProcessBar是你放置图片的窗口
obj.ShowDialog();
}publicvoid StartPro()
{
td=new Thread(chang);
td.Start();
}

http://topic.csdn.net/u/20090710/13/6a4b93fc-dc7c-41c6-89ec-50a12959feb3.html
[/Quote]
问题暂未解决 可能是我对多线程不太了解..引起硬直的方法应该是datachange吧 我把头部和尾部都加上了没有作用啊.Change事件的委托在Form1_Load里面

TheOPCgroup.DataChange += new DIOPCGroupEvent_DataChangeEventHandler(XXX_DataChange);

风之影子 2009-12-23
  • 打赏
  • 举报
回复
delegate void HandleInterfaceUpdateDelegate();  //委托,此为重点 
HandleInterfaceUpdateDelegate interfaceUpdateHandle;
Thread td;
public formMain()
{
InitializeComponent();
interfaceUpdateHandle = new HandleInterfaceUpdateDelegate(StartPro); //实例化委托对象
}


在你进行操作的方法里第一句加上:
this.Invoke(interfaceUpdateHandle);//用指定的参数列表执行指定的委托

最后一行加上:
td.Abort();


这是相关的方法。
private void chang()
{
ProcessBar obj = new ProcessBar();注:ProcessBar是你放置图片的窗口
obj.ShowDialog();
}


public void StartPro()
{
td= new Thread(chang);
td.Start();
}


http://topic.csdn.net/u/20090710/13/6a4b93fc-dc7c-41c6-89ec-50a12959feb3.html
linekery 2009-12-23
  • 打赏
  • 举报
回复
backgroundworker dowork 事件 指向你的操作
然后调用 .RunWorkerAsync(); 就可以开始执行 dowork 了

这个时候 主线程 还是 空闲着 你可以放个动画片 跟用户互动一下啥的
最后执行完毕之后 dowork 最后 加个这个语句:
Invoke((MethodInvoker)(() => "别xxx看了,干活吧"));
OROCHIORI513 2009-12-23
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 yangglemu 的回复:]
backgroundworker在工具箱的组件部分里

2分钟很长了,你试试用backgroundworker操作一下,但backgroundworker也只是不让界面暂停,不会让你的业务处理速度提高,我猜2分钟的假死是由代码引起的,仔细检查一下,关键位置单步执行,同时看看各个变量的值
[/Quote]
程序里定义了许多的数组 在Form1_Load里面写了许多对数据库操作的东西 在DataChange里面也用了许许多多次Load事件里面取出的数组 因为客户需要把程序写活 所以里面有许多都是重复的 只不过是修改一下参数
我猜想在CLICK事件完成之后 程序虽然没有执行DATACHANG里面的那些代码 但是已经“检测”了引用过太多次的数组 所以硬直这么长时间就是为了为程序连接成功后快速引用 也许是OPC这个东西本身有些东西吧 不清楚到底咋回事 纯猜想
OROCHIORI513 2009-12-23
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 zcpzzy 的回复:]
可以用“同步进度条”,即使界面卡死了,也可以用API来让进度条显示进度。

[/Quote]
同步进度条 指的是?
卓才琣 2009-12-23
  • 打赏
  • 举报
回复
可以用“同步进度条”,即使界面卡死了,也可以用API来让进度条显示进度。
  • 打赏
  • 举报
回复
backgroundworker在工具箱的组件部分里

2分钟很长了,你试试用backgroundworker操作一下,但backgroundworker也只是不让界面暂停,不会让你的业务处理速度提高,我猜2分钟的假死是由代码引起的,仔细检查一下,关键位置单步执行,同时看看各个变量的值
myrroom 2009-12-23
  • 打赏
  • 举报
回复
不要都有UI线程来执行
OROCHIORI513 2009-12-23
  • 打赏
  • 举报
回复
backgroundworker好东西啊 下点源代码回去研究下 希望可以搞定
lindenrty 2009-12-23
  • 打赏
  • 举报
回复
backgroundworker是组件 默认就在工具箱里面
其实就是为了让多线程方便使用而弄出来的东西
OROCHIORI513 2009-12-23
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wuyq11 的回复:]
多线程backgroundworker
Application.DoEvents()是为了在加载大量数据时能够有一个数据加载的提示,不至于系统出现假死的现象
可确保辅助线程激发的任何事件都由该 UI 线程处理
[/Quote]
backgroundworker是组件么 怎样引用
OROCHIORI513 2009-12-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 lindenrty 的回复:]
要让界面不死 最好的方法就是用多线程...

[/Quote]
也就是说 我这个情况 用多线程还是能解决的 是不
加载更多回复(4)

111,125

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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