104 lines
3.1 KiB
C#
104 lines
3.1 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading;
|
|
using MarketData.MarketDataModel;
|
|
using MarketData.DataAccess;
|
|
using MarketData.Utils;
|
|
|
|
namespace MarketData.Helper
|
|
{
|
|
public class MarketDataHelperBase<T>
|
|
{
|
|
private List<T> queue=null;
|
|
private int currentIndex=-1;
|
|
public MarketDataHelperBase()
|
|
{
|
|
}
|
|
public List<T> Queue
|
|
{
|
|
get{return queue;}
|
|
set{queue=value;}
|
|
}
|
|
public void ShuffleQueue()
|
|
{
|
|
int itemCount = queue.Count;
|
|
Random generator = new Random();
|
|
for (int index = 0; index < itemCount; index++)
|
|
{
|
|
int r1;
|
|
int r2;
|
|
r1 = generator.Next(0, itemCount - 1);
|
|
r2 = generator.Next(0, itemCount - 1);
|
|
while (r2.Equals(r1)) r2 = generator.Next(0, itemCount - 1);
|
|
T temp = queue[r1];
|
|
queue[r1] = queue[r2];
|
|
queue[r2] = temp;
|
|
}
|
|
}
|
|
|
|
public T PeekQueueItem()
|
|
{
|
|
if(null==queue)return default(T);
|
|
if (currentIndex+1 >= queue.Count) return default(T);
|
|
return queue[currentIndex+1];
|
|
}
|
|
|
|
public T GetQueueItem()
|
|
{
|
|
if(null==queue)return default(T);
|
|
if (currentIndex+1 >= queue.Count) return default(T);
|
|
return queue[++currentIndex];
|
|
}
|
|
|
|
public int Index
|
|
{
|
|
get{return currentIndex;}
|
|
set{currentIndex=value;}
|
|
}
|
|
|
|
public ManualResetEvent[] ResizeEvents(ManualResetEvent[] events)
|
|
{
|
|
ManualResetEvent[] busyEvents=GetBusyEvents(events);
|
|
if(busyEvents.Length!=0)
|
|
{
|
|
MDTrace.WriteLine(LogLevel.DEBUG,String.Format("Resizing event queue to {0}",busyEvents.Length));
|
|
ManualResetEvent[] resizedEvents=new ManualResetEvent[busyEvents.Length];
|
|
Array.Copy(busyEvents, resizedEvents, busyEvents.Length);
|
|
return resizedEvents;
|
|
}
|
|
return events;
|
|
}
|
|
|
|
public ManualResetEvent[] GetBusyEvents(ManualResetEvent[] resetEvents)
|
|
{
|
|
List<ManualResetEvent> availableEvents = new List<ManualResetEvent>();
|
|
for (int index = 0; index < resetEvents.Length; index++)
|
|
{
|
|
if (!resetEvents[index].WaitOne(0))
|
|
{
|
|
MDTrace.WriteLine(LogLevel.DEBUG,String.Format("Event {0} is still doing work",resetEvents[index].SafeWaitHandle.DangerousGetHandle().ToString()));
|
|
availableEvents.Add(resetEvents[index]);
|
|
}
|
|
}
|
|
MDTrace.WriteLine(LogLevel.DEBUG,String.Format("The event queue has {0} busy slots",availableEvents.Count));
|
|
return availableEvents.ToArray();
|
|
}
|
|
|
|
public ManualResetEvent[] GetAvailableEvents(ManualResetEvent[] resetEvents)
|
|
{
|
|
List<ManualResetEvent> availableEvents = new List<ManualResetEvent>();
|
|
for (int index = 0; index < resetEvents.Length; index++)
|
|
{
|
|
if (resetEvents[index].WaitOne(0))
|
|
{
|
|
MDTrace.WriteLine(LogLevel.DEBUG,String.Format("Event {0} is available for work",resetEvents[index].SafeWaitHandle.DangerousGetHandle().ToString()));
|
|
availableEvents.Add(resetEvents[index]);
|
|
}
|
|
}
|
|
return availableEvents.ToArray();
|
|
}
|
|
}
|
|
}
|