using System;
using System.Collections.Generic;
using System.Text;
using ProcessHacker.Native.Api;
using ProcessHacker.Native.Objects;
using ProcessHacker.Native.Security;
namespace ProcessHacker.Native.Threading
{
///
/// Represents a keyed event.
///
public class KeyedEvent : NativeObject
{
///
/// Creates a new keyed event.
///
public KeyedEvent()
: this(null)
{ }
///
/// Creates or opens a keyed event.
///
///
/// The name of the new keyed event, or the name of an
/// existing keyed event.
///
public KeyedEvent(string name)
{
this.Handle = KeyedEventHandle.Create(
KeyedEventAccess.All,
name,
ObjectFlags.OpenIf,
null
);
}
///
/// Releases the specified key. If no other thread is waiting
/// on the key, the function blocks until a thread does.
///
/// The key, which must be divisible by 2.
public void ReleaseKey(int key)
{
this.Handle.ReleaseKey(new IntPtr(key), false, long.MinValue, false);
}
///
/// Releases the specified key. If no other thread is waiting
/// on the key, the function blocks until a thread does.
///
/// The key, which must be divisible by 2.
/// A timeout value, in milliseconds.
public void ReleaseKey(int key, int timeout)
{
this.Handle.ReleaseKey(new IntPtr(key), false, timeout * Win32.TimeMsTo100Ns, true);
}
///
/// Releases the specified key. If no other thread is waiting
/// on the key, the function blocks until a thread does.
///
/// The key, which must be divisible by 2.
/// A time to wait until.
public void ReleaseKey(int key, DateTime timeout)
{
this.Handle.ReleaseKey(new IntPtr(key), false, timeout.ToFileTime(), false);
}
///
/// Waits for the specified key to be released.
///
/// The key, which must be divisible by 2.
public void WaitKey(int key)
{
this.Handle.WaitKey(new IntPtr(key), false, long.MinValue, false);
}
///
/// Waits for the specified key to be released.
///
/// The key, which must be divisible by 2.
/// A time to wait until.
public void WaitKey(int key, int timeout)
{
this.Handle.WaitKey(new IntPtr(key), false, timeout * Win32.TimeMsTo100Ns, true);
}
///
/// Waits for the specified key to be released.
///
/// The key, which must be divisible by 2.
/// A time to wait until.
public void WaitKey(int key, DateTime timeout)
{
this.Handle.WaitKey(new IntPtr(key), false, timeout.ToFileTime(), false);
}
}
}