关于delphi线程的问题

DUTEddy 2015-08-07 04:25:52
WaitForSingleObject(event, INFINITE);
Sleep(1000);
Windows.ResetEvent(event);
...
Windows.SetEvent(event);

这是在一个线程的execute里的代码,如果执行到sleep的时候另一个线程也通过了WaitForSingleObject的判断,那么怎么办?有办法把WaitForSingleObject和Windows.ResetEvent(event)搞成原子操作?
...全文
597 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
弘石 2015-08-28
  • 打赏
  • 举报
回复
线程同步锁,SyncObjs单元的TCriticalSection类 加锁enter,解锁leave 如果是进程同步,需要用TMutex
cnlife 2015-08-24
  • 打赏
  • 举报
回复
楼主想做什么呢??线程同步???
DUTEddy 2015-08-24
  • 打赏
  • 举报
回复
引用 12 楼 cnlife 的回复:
楼主想做什么呢??线程同步???
对的。
DUTEddy 2015-08-18
  • 打赏
  • 举报
回复
引用 8 楼 suiyunonghen 的回复:
不明白,这里放一个Sleep有啥意义啊,你WaitForSingleObject(event, INFINITE);,这个的时候就,如果Event 无信号,就已经让出了CPU线程,会一直死等,如果有信号那么其他的线程也是一样的的到 Sleep位置,然后就是随机抢占这个资源了。
这里这个sleep只是让出错的可能性变大了,实际应用时是没有这个sleep的,但是就算没有这个sleep,也有可能有别的线程在这个空当进来的,对吗。
弘石 2015-08-13
  • 打赏
  • 举报
回复
是不是用同步锁
  • 打赏
  • 举报
回复
需求不清楚,至少我不知道你要做什么, 没法帮你。。
不得闲 2015-08-13
  • 打赏
  • 举报
回复
不明白,这里放一个Sleep有啥意义啊,你WaitForSingleObject(event, INFINITE);,这个的时候就,如果Event 无信号,就已经让出了CPU线程,会一直死等,如果有信号那么其他的线程也是一样的的到 Sleep位置,然后就是随机抢占这个资源了。
xumenger 2015-08-12
  • 打赏
  • 举报
回复
这个问题是你凭空想的,还是有什么具体的实际场景?
SVIP_ 2015-08-12
  • 打赏
  • 举报
回复
首先你要弄清楚是什么需求
  • 打赏
  • 举报
回复
楼主的要求是 WaitForSingleObject(event, INFINITE); Sleep(1000); Windows.ResetEvent(event); 执行的时候,另一个线程不能运行。 那么 楼主应该 在WaitForSingleObject(event, INFINITE); Sleep(1000); Windows.ResetEvent(event);后面发送一个通知给另一个线程。 代码类似于: A线程: WaitForSingleObject(event, INFINITE); Sleep(1000); Windows.ResetEvent(event); Windows.setEvent(eventB); 。。。。。。。。 B线程: events:array[0..1] of Thandle events[0]:= xxxEvent; events[1] := eventB; waitformultObjects(events, ......); ...................do more ..............
  • 打赏
  • 举报
回复
SingnalObjectAndWait
DUTEddy 2015-08-10
  • 打赏
  • 举报
回复
引用 2 楼 jankercsdn 的回复:
简单就这样, WaitForSingleObject(event, INFINITE); Windows.ResetEvent(event); Sleep(1000);
sleep只是放大了出错的可能,去掉的话那里也是有可能有其他线程进入的吧?
看那山瞧那水 2015-08-07
  • 打赏
  • 举报
回复
简单就这样, WaitForSingleObject(event, INFINITE); Windows.ResetEvent(event); Sleep(1000);
Mr Dang 2015-08-07
  • 打赏
  • 举报
回复
这段代码就是使几个线程在这里同步,也就是串行操作你省掉代码的这部分资源。

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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