delphi如何实现c#中的AutoResetEvent以及事件列表?

ilikeff8 2017-10-18 04:27:49
1 c#中的AutoResetEvent

EventWaitHandle waitHandle_UpdateTagScreen = new AutoResetEvent(false);

// 在A方法中设置阻塞当前线程,最多等待timeOut毫秒
waitHandle_UpdateTagScreen.WaitOne(timeOut);

// 在B方法中让让当前线程结束阻塞状态
// todo
waitHandle_UpdateTagScreen.Set();


delphi中如何实现

2 c#中的事件列表+=,-=

// 从事件列表里删除某事件响应事件
OnPushButton -= Api_OnPushButton_AutoTurnOff;

// 事件可以一直添加,按照添加的顺序执行
OnPushButton += Api_OnPushButton_AutoTurnOff;
OnPushButton += Api_OnPushButton_AutoTurnOff2;
...

delphi中似乎只能指定一个:
OnPushButton := Api_OnPushButton_AutoTurnOff;
或者说也是可以实现的?
...全文
619 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
ilikeff8 2017-10-19
  • 打赏
  • 举报
回复
好久没用delphi,有些细节忘了,需要重新回忆一下
ilikeff8 2017-10-18
  • 打赏
  • 举报
回复
引用 1 楼 DelphiGuy 的回复:
第一个直接用Sleep(timeOut)或者SleepEx(timeOut, false)就可以 第二个,Delphi确实不支持同时启用多个事件处理,你只能在一个里面调用其他的事件处理过程,或者用动态数组、TList之类的模拟一下,不过没什么必要
的确,我吧事情想复杂了,简化了需求,其实是实现2个线程同步,一个线程等待,另一个线程接收硬件传上来的信号,当收到信号时,打个成功标记,然后等待线程继续,处理成功或超时的逻辑,简单模型就是 public partial class Form1 : Form { EventWaitHandle waitHandle = new AutoResetEvent(false); bool isOK = false; public Form1() { InitializeComponent(); ThreadPool.QueueUserWorkItem(obj => { waitHandle.WaitOne(3000); // 阻塞 if (isOK) { MessageBox.Show("OK"); } else { MessageBox.Show("Error"); } }); ThreadPool.QueueUserWorkItem(obj => { Thread.Sleep(1000); // 如果总等待时长1秒,未超过3秒,则上面的线程就会返回OK // Thread.Sleep(5000); // 如果总等待时长1+5=6秒,超过3秒,则上面的线程就会返回Error isOK = true; waitHandle.Set(); // 释放上面的线程,让其可以运行下去 }); } }[/code] 换成Sleep后,目前没看出什么副作用 [code=csharp] ThreadPool.QueueUserWorkItem(obj => { // waitHandle.WaitOne(3000); // 阻塞 Thread.Sleep(3000); if (isOK) { MessageBox.Show("OK"); } else { MessageBox.Show("Error"); } }); ThreadPool.QueueUserWorkItem(obj => { Thread.Sleep(1000); // 如果总等待时长1秒,未超过3秒,则上面的线程就会返回OK // Thread.Sleep(5000); // 如果总等待时长1+5=6秒,超过3秒,则上面的线程就会返回Error isOK = true; // waitHandle.Set(); // 释放上面的线程,让其可以运行下去 }); 转换成delphi后,使用网上的这种延迟 4、不占CPU不挂起 function TForm1.HaveSigned(MaxWaitTime: Cardinal): Boolean; var I:Integer; var WaitedTime:Cardinal; begin WaitedTime:=0; while (WaitedTime<MaxWaitTime) do begin SleepEx(10,False); Inc(WaitedTime,10); Application.ProcessMessages ; end end; 不能直接支持事件列表挺麻烦的,因为我这里的确要执行多个
  • 打赏
  • 举报
回复
第一个直接用Sleep(timeOut)或者SleepEx(timeOut, false)就可以 第二个,Delphi确实不支持同时启用多个事件处理,你只能在一个里面调用其他的事件处理过程,或者用动态数组、TList之类的模拟一下,不过没什么必要

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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