Esempio n. 1
0
        /// <inheritdoc />
        public virtual void Dispose()
        {
            lock (ValueChangedHandlers)
            {
                ValueChangedHandlers.Clear();

                ValueChangedTimer?.Dispose();
            }
        }
Esempio n. 2
0
        public void UnregisterValueChangedEventHandler(Func <byte[], bool> eventHandler)
        {
            lock (ValueChangedHandlers)
            {
                ValueChangedHandlers.Remove(eventHandler);

                if (ValueChangedHandlers.Count == 0)
                {
                    StopTimer();
                    LastValue = null;
                }
            }
        }
Esempio n. 3
0
        public void RegisterValueChangedEventHandler(Func <byte[], bool> eventHandler,
                                                     int size,
                                                     int offset      = 0,
                                                     int frequencyMs = 200)
        {
            lock (ValueChangedHandlers)
            {
                Frequency = Math.Min(frequencyMs,
                                     Frequency);

                if (ValueChangedTimer == null)
                {
                    ValueChangedOffset = offset;
                    LastValue          = Read(size,
                                              ValueChangedOffset);
                    ValueChangedTimer = new Timer(CheckValueChanged,
                                                  null,
                                                  frequencyMs,
                                                  Timeout.Infinite);
                }

                ValueChangedHandlers.Add(eventHandler);
            }
        }
Esempio n. 4
0
        private void CheckValueChanged(object _)
        {
            ValueChangedMutex.WaitOne();

            try
            {
                if (ValueChangedSuspended)
                {
                    return;
                }

                byte[] newValue = null;

                try
                {
                    newValue = Read(LastValue.Length,
                                    ValueChangedOffset);
                }
                catch (Win32Exception)
                {
                    if (LastValue == null)
                    {
                        return;
                    }
                }

                if (newValue?.SequenceEqual(LastValue) == false)
                {
                    var toRm = new List <Func <byte[], bool> >();
                    LastValue = newValue;

                    lock (ValueChangedHandlers)
                        foreach (var handler in ValueChangedHandlers)
                        {
                            try
                            {
                                if (handler(newValue))
                                {
                                    toRm.Add(handler);
                                }
                            }
                            catch
                            {
                                // ignored
                            }
                        }

                    foreach (var handler in toRm)
                    {
                        UnregisterValueChangedEventHandler(handler);
                    }
                }

                if (Process.Native.HasExited)
                {
                    lock (ValueChangedHandlers)
                    {
                        StopTimer();
                        ValueChangedHandlers.Clear();
                    }
                }

                else
                {
                    RestartTimer();
                }
            }
            finally
            {
                ValueChangedMutex.ReleaseMutex();
            }
        }