private void SampleMonitoredItems(object data)
{
try
{
//Utils.Trace("Server: {0} Thread Started.", Thread.CurrentThread.Name);
int sleepCycle = Convert.ToInt32(data, CultureInfo.InvariantCulture);
int timeToWait = sleepCycle;
while (m_server.IsRunning)
{
DateTime start = DateTime.UtcNow;
// wait till next sample.
if (m_shutdownEvent.WaitOne(timeToWait, false))
{
break;
}
// get current list of items to sample.
List<ISampledDataChangeMonitoredItem> items = new List<ISampledDataChangeMonitoredItem>();
lock (m_lock)
{
// check if halted.
if (m_samplingThread == null)
{
break;
}
uint disabledItemCount = 0;
Dictionary<uint,ISampledDataChangeMonitoredItem>.Enumerator enumerator = m_items.GetEnumerator();
while (enumerator.MoveNext())
{
ISampledDataChangeMonitoredItem monitoredItem = enumerator.Current.Value;
if (monitoredItem.MonitoringMode == MonitoringMode.Disabled)
{
disabledItemCount++;
continue;
}
// check whether the item should be sampled.
//if (!monitoredItem.SamplingIntervalExpired())
//{
// continue;
//}
items.Add(monitoredItem);
}
}
// sample the values.
DoSample(items);
int delay = (int)(DateTime.UtcNow - start).TotalMilliseconds;
timeToWait = sleepCycle;
if (delay > sleepCycle)
{
timeToWait = 2*sleepCycle - delay;
if (timeToWait < 0)
{
Utils.Trace("WARNING: SamplingGroup cannot sample fast enough. TimeToSample={0}ms, SamplingInterval={1}ms", delay, sleepCycle);
timeToWait = sleepCycle;
}
}
}
//Utils.Trace("Server: {0} Thread Exited Normally.", Thread.CurrentThread.Name);
}
catch (Exception e)
{
Utils.Trace(e, "Server: {0} Thread Exited Unexpectedly.", Thread.CurrentThread.Name);
}
}