我需要一些机制,让人联想到Win32重置事件,我可以通过具有waitforsingleobject()和waitgormultipleObjects()(仅需要.. singleObject()版本)的功能来检查它们.但是我正在瞄准多个平台,所以我拥有的只是boost :: threads(afaik).我想出了以下课程,想询问潜在问题以及是否取决于任务.预先感谢. class reset_event { bool flag, auto_reset; boost::condition_variable cond_var; boost::mutex mx_flag; public: reset_event(bool _auto_reset = false) : flag(false), auto_reset(_auto_reset) { } void wait() { boost::unique_lock LOCK(mx_flag)
以下是关于 autoresetevent 的编程技术问答
我在申请中有以下代码多年,从未从中看到过问题. while ((PendingOrders.Count > 0) || (WaitHandle.WaitAny(CommandEventArr) != 1)) { lock (PendingOrders) { if (PendingOrders.Count > 0) { fbo = PendingOrders.Dequeue(); } else { fbo = null; } } // Do Some Work if fbo is != null } neworderevent(自动重置事件)和ExiteVent(手动重置事件)组成的Commandeventarr. ,但我不确定这是否是线程安全的(假设n个生产者线程在重新启动之前锁定了队列,并且一个运行上面代码的消
我想知道, 为什么我想在AutoResetEvent的ctor中传递true? 我创建一个waitHandle,以便任何人都会呼叫WaitOne()的人实际上会等待. 如果我用true实例,它将好像立即发出信号 - 就像是正常的流动,而无需等待. EventWaitHandle _waitHandle = new AutoResetEvent (false); void Main() { new Thread (Waiter).Start(); Thread.Sleep (1000); _waitHandle.Set(); Console.ReadLine(); } void Waiter() { Console.WriteLine ("AAA"); _waitHandle.WaitOne();
我正在尝试实现AutoResetEvent.出于目的,我使用一个非常简单的类: public class MyThreadTest { static readonly AutoResetEvent thread1Step = new AutoResetEvent(false); static readonly AutoResetEvent thread2Step = new AutoResetEvent(false); void DisplayThread1() { while (true) { Console.WriteLine("Display Thread 1"); Thread.Sleep(1000); thread1Step.Set(); thread2Step.WaitOne(); }
我在工作线程中有一个对象,我可以指示该对象停止运行.我可以使用bool或autoresetevent来实现它: 布尔值: private volatile bool _isRunning; public void Run() { while (_isRunning) { doWork(); Thread.Sleep(1000); } } autoresetevent: private AutoResetEvent _stop; public void Run() { do { doWork(); } while (!_stop.WaitOne(1000)); } 然后,Stop()方法将将_isRunning设置为false,或调用_stop.Set(). 除此之外,使用Autoresetevent的解决方案可能会更快地停止,这些方法之间是否有任何区别?一个比另一个
我已经阅读了有关此文档的文档,我想我理解.一个这是正确的吗? 解决方案 是.就像收费站和门之间的区别. ManualResetEvent是门,需要手动关闭(重置). AutoResetEvent是一个收费站,允许一辆汽车在下一个汽车通过之前自动关闭. 其他解决方案 只想想象AutoResetEvent执行WaitOne()和Reset()作为单个原子操作. AutoResetEvent还保证仅发布一个等待线程. 其他解决方案 简短的答案是肯定的.最重要的区别是,Autoresetevent只能允许一个等待线程继续.另一方面,手动resetevent将继续允许线程,甚至同时允许多个线程,直到告诉它停止(重置).
我应该用什么来获得语义等同于在Java中? (请参阅此问题 for ManualResetevent). ) 解决方案 @user249654的答案看起来很有希望.我添加了一些单元测试以验证它,实际上它可以按预期进行. 我还添加了waitOne超时的waitOne. 如果其他人发现它有用,则代码在这里: 单元测试 import org.junit.Assert; import org.junit.Test; import static java.lang.System.currentTimeMillis; /** * @author Drew Noakes http://drewnoakes.com */ public class AutoResetEventTest { @Test public void synchronisesProperly() throws InterruptedException {
如何正确同步?目前,在e.WaitOne()完成后,SetData可能已经调用,因此d可以将其设置为另一个值.我试图插入锁,但导致僵局. AutoResetEvent e = new AutoResetEvent(false); public SetData(MyData d) { this.d=d; e.Set(); // notify that new data is available } // This runs in separate thread and waits for d to be set to a new value void Runner() { while (true) { e.WaitOne(); // waits for new data to process DoLongOperationWith_d(d); } } 最好的解决方案是引入一个新的boolean变量data
我是C#的新手,目前正在处理后端代码以支持引脚垫.基本上,我的代码 OpenDevice() -> RequestPIN() -> key in PIN on PIN PAD -> GetResultPIN() -> ConsolePrintOutPIN() -> Print keyed PIN on the Console 我不知道如何为此编写线程,因此一旦引脚后的" Enter键"在设备上击中,系统将自动滚动以函数GetResultPIN().因此,凭着我的基本知识,我使用Console.ReadLine()编写了以下代码以分开每个过程: static void Main(string[] args) { // 1. Open PIN Pad device OpenDevice(); Console.ReadLine();// to hold up from the previous proced
我希望我的功能等到事件WebBrowser.DocumentCompleted完成. 我正在使用AutoResetEvent,这是我的代码: private static WebBrowser _browser = new WebBrowser(); private static AutoResetEvent _ar = new AutoResetEvent(false); private bool _returnValue = false; public Actions() //constructor { _browser.DocumentCompleted += PageLoaded; } public bool MyFunction() { _browser.Navigate("https://www.somesite.org/"); _ar.WaitOne(); // wait until receiving the signal
我正在使用WPF,我的UI上有一个按钮. 用户单击它时,我有一个使用Autoresetevent的新线程上运行新方法的for循环. 在该新线程上的该方法中,我正在使用标签,我们称其为lblstatus.我想更新该线程中不在UI上的标签.使用WPF,我必须使用dispatcher.invoke. 这是我的代码的示例: Thread thread= new Thread(StartLooking); thread.Start(); _waitHandle.WaitOne(); private void StartLooking(object value) { if (lblStatus.Dispatcher.Thread == Thread.CurrentThread) { lblStatus.Content = "Scanning>..."; } else {
在这里,我们有一个Grid Button.当用户单击按钮时,执行了实用程序类中的方法,该方法迫使应用程序接收单击网格.代码流必须在此处停止,直到用户单击Grid. 才能继续下去. 我之前也有类似的问题: 等待等待用户单击C#wpf 在这个问题中,我使用异步/等待的答案有效,但是由于我要将其用作API的一部分,所以我不想使用异步/等待,因为消费者将必须标记他们与我不想要的异步的方法. 如何编写Utility.PickPoint(Grid grid)实现此目标的方法? 我看到了这可能有帮助,但没有完全理解它在这里应用于诚实: 阻止事件完成 将其视为控制台应用程序中的Console.ReadKey()方法.当我们调用此方法时,代码流停止,直到输入一些值.在我们输入某件事之前,调试器不会继续.我想要PickPoint()方法的确切行为.代码流将停止,直到用户单击网格.
我有一个线程,该线程会创建可变数量的工作线程并在它们之间分配任务.通过传递线程a taskqueue 对象来解决这一问题,您将在下面看到其实现. 这些工作线程简单地迭代他们给出的 taskquequeue 对象,执行每个任务. private class TaskQueue : IEnumerable { public int Count { get { lock(this.tasks) { return this.tasks.Count; } } } private readonly Queue tasks = new Queue(); private readonly AutoResetEvent taskWaitHandle = new Aut
考虑以下模式: private AutoResetEvent signal = new AutoResetEvent(false); private void Work() { while (true) { Thread.Sleep(5000); signal.Set(); //has a waiting thread definitely been signaled by now? signal.Reset(); } } public void WaitForNextEvent() { signal.WaitOne(); } 这种模式的目的是允许外部消费者等待某个事件(例如 - 消息到达). WaitForNextEvent未从类中调用. 举一个应该熟悉的示例,请考虑System.Diagnostics.Process.它暴露了Exited事件,但也公开了WaitForE
如果使用setEvent设置手动复位事件但不使用ResetEvent复位则会发生什么情况;并且该事件被触发多次。 以下是示例任务: void foo() { ... SetEvent(hEvent1); ... } void foo1() { ... SetEvent(hEvent2); ... } int MainHandler() { ... dwEvent = WaitForMultipleObjects(2, ghEvents,//对象数组 FALSE,//等待任何对象 5000); switch(dwEvent) { case hEvent1: //做某事 break; case hEvent2: //做某事 break; } } 现在,假设hEvent1的情况正在执行仍然设置),不知何故再次触发hEvent1。我故意不把ResetEvent(hEvent1),即使它是手动
我应该使用什么来获得等同于 AutoResetEvent 在 Java 中?(有关 ManualResetEvent,请参阅 此问题). 解决方案 @user249654 的回答看起来很有希望.我添加了一些单元测试来验证它,它确实按预期工作. 我还添加了一个需要超时的 waitOne 重载. 代码在这里,以防其他人发现它有用: 单元测试 import org.junit.Assert; import org.junit.Test; import static java.lang.System.currentTimeMillis; /** * @author Drew Noakes http://drewnoakes.com */ public class AutoResetEventTest { @Test public void synchronisesProperly() throws InterruptedException