c# AutoResetEvent 循环暂停 主界面卡死

quentin66 2014-12-15 10:20:27
AutoResetEvent eventPauseRequired = new AutoResetEvent(false);
AutoResetEvent eventResumeRequired = new AutoResetEvent(false);
//执行操作
private void button1_Click(object sender, EventArgs e)
{
for (int i = 0; i < dt_main.Rows.Count; i++)
{
if (eventPauseRequired.WaitOne(0))
{
eventResumeRequired.WaitOne();
}
else
{
..............................
eventPauseRequired.Set();
}
}
以上是要执行的操作
======================================================
以下是接收外部程序发来的信息,收到信息则继续以上的操作
public const int USER = 0x0400;
public const int WM_CMM = USER + 10000;

protected override void DefWndProc(ref System.Windows.Forms.Message m)
{
switch (m.Msg)
{
case WM_CMM: //处理消息
if (m.WParam.ToInt32() == 0)
{
eventResumeRequired.Set();
}
break;
default:
base.DefWndProc(ref m);//调用基类函数处理非自定义消息。
break;
}
}

============================================
i=0执行完毕就卡死,求教各位。多谢!
...全文
413 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
iyomumx 2014-12-16
  • 打赏
  • 举报
回复
执行到 eventResumeRequired.WaitOne(); 时主线程被阻塞,消息循环无法处理新的消息,如果没有其他线程去Set那么这里就死锁了
  • 打赏
  • 举报
回复
引用 6 楼 ouyang4683 的回复:
没看出来要做什么, eventResumeRequired.WaitOne(); 一直在等, 没人reset();
lz 说明过了,“接收外部程序发来的信息,收到信息则继续以上的操作”。
ouyang4683 2014-12-16
  • 打赏
  • 举报
回复
没看出来要做什么, eventResumeRequired.WaitOne(); 一直在等, 没人reset();
quentin66 2014-12-16
  • 打赏
  • 举报
回复
protected override void DefWndProc(ref System.Windows.Forms.Message m) { switch (m.Msg) { case WM_CMM: //处理消息 if (m.WParam.ToInt32() == 0) { eventResumeRequired.Set(); ExecuteCMM(); } break; default: base.DefWndProc(ref m);//调用基类函数处理非自定义消息。 break; } } 以上接收信息 ========================================================== protected void ExecuteCMM() { for (int i = 0; i < dt_main.Rows.Count; i++) { if (eventPauseRequired.WaitOne(0)) { eventResumeRequired.WaitOne(); } 。。。。。。。。。。。。。。。。 eventPauseRequired.Set(); if (i == dt_main.Rows.Count - 1) { ExeThread.Abort(); eventResumeRequired.Set(); } } } ======================================================= AutoResetEvent eventPauseRequired = new AutoResetEvent(false); AutoResetEvent eventResumeRequired = new AutoResetEvent(false); Thread ExeThread; private void button1_Click(object sender, EventArgs e) { ExeThread = new Thread(new ThreadStart(ExecuteCMM)); ExeThread.Start(); } 非常感谢各位,受益良多!
quentin66 2014-12-16
  • 打赏
  • 举报
回复
引用 8 楼 iyomumx 的回复:
执行到 eventResumeRequired.WaitOne(); 时主线程被阻塞,消息循环无法处理新的消息,如果没有其他线程去Set那么这里就死锁了
感谢回复。 是否新建线程处理,一脑袋浆糊了
quentin66 2014-12-16
  • 打赏
  • 举报
回复
引用 5 楼 sp1234 的回复:
没有什么“更简单有效的处理方式”,除非你从设计思路上就能想通。 既然你“阻塞”,自然就是“卡死”,这个结果是自己招来的。从一开始,不用太动脑筋就应该知道这样的“伪多线程程序”程序肯定会有这种结果。要做到“接收外部程序发来的信息,收到信息则继续以上的操作”,应该异步处理“后续操作”。 不要写代码,先画一个流程图(或者时序图),看看你是否能够正确地画出异步操作的设计图来。如果不能,先从这里的逻辑流程设计着手,不要急于写什么代码。
感谢你的回复,非科班就没这么专业,多谢你的指点。 业余程序员
  • 打赏
  • 举报
回复
没有什么“更简单有效的处理方式”,除非你从设计思路上就能想通。 既然你“阻塞”,自然就是“卡死”,这个结果是自己招来的。从一开始,不用太动脑筋就应该知道这样的“伪多线程程序”程序肯定会有这种结果。要做到“接收外部程序发来的信息,收到信息则继续以上的操作”,应该异步处理“后续操作”。 不要写代码,先画一个流程图(或者时序图),看看你是否能够正确地画出异步操作的设计图来。如果不能,先从这里的逻辑流程设计着手,不要急于写什么代码。
quentin66 2014-12-15
  • 打赏
  • 举报
回复
引用 2 楼 tcmakebest 的回复:
初始化的时候,两个参数都是false,那等任何一下都会卡死. 一般是用于多个线程之间的协调,楼主这些代码明显是在同一个线程即UI线程,不需要用得如此费劲.
感谢你的回复,是否有更简单有效的处理方式,望指点一二。
quentin66 2014-12-15
  • 打赏
  • 举报
回复
引用 1 楼 github_22161131 的回复:
这都是在UI线程执行的,已经阻塞了,就无法处理消息,也就一直是阻塞状态。 不要阻塞UI线程,应该在其它线程处理实际任务,UI线程通过event来控制任务。
感谢你的回复。 以上代线程代码基本都是拼凑起来的,并不甚解。所以可否给个稍详细点的说明
tcmakebest 2014-12-15
  • 打赏
  • 举报
回复
初始化的时候,两个参数都是false,那等任何一下都会卡死. 一般是用于多个线程之间的协调,楼主这些代码明显是在同一个线程即UI线程,不需要用得如此费劲.
winnowc 2014-12-15
  • 打赏
  • 举报
回复
这都是在UI线程执行的,已经阻塞了,就无法处理消息,也就一直是阻塞状态。 不要阻塞UI线程,应该在其它线程处理实际任务,UI线程通过event来控制任务。

110,538

社区成员

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

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

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