private void DoLoop()
        {
            for (; m_continue;)
            {
                if (null == m_func)
                {
                    Thread.Sleep(256);
                    continue;
                }

                byte* ptr = m_func(m_handle, 256);
                if (null == ptr)
                {
                    continue;
                }
                var func = Tick;
                if (null == func)
                {
                    continue;
                }
                Quote quote = new Quote(ptr);
                if ((quote.Bids.Length > 0) || (quote.Asks.Length > 0))
                {
                    TickEventArgs e = new TickEventArgs(quote);
                    func(this, e);
                }
            }

            m_func(m_handle, 0);
        }
 internal void Add(Quote quote)
 {
     lock (m_synchronizer)
     {
         long now = EnvironmentEx.GetTickCountEx();
         QuoteEx entry = new QuoteEx(now, quote);
         m_first.Add(entry);
     }
 }
        internal void Set(Quote[] quotes)
        {
            m_quotes.Clear();

            Quote last = quotes.Last();
            m_time = 0;

            foreach (var element in quotes)
            {
                long time = (long)(element.CreatingTime - last.CreatingTime).TotalMilliseconds;
                long delta = (m_time - time);
                if (delta <= m_intervalInMs)
                {
                    QuoteEx quote = new QuoteEx(time, element);
                    m_quotes.Enqueue(quote);
                }
            }
        }
 internal QuoteEx(long time, Quote quote)
     : this()
 {
     m_time = time;
     m_quote = quote;
 }
 internal QuoteEx(Quote quote)
     : this()
 {
     m_time = EnvironmentEx.GetTickCountEx();
     m_quote = quote;
 }
 internal TickEventArgs(Quote quote)
 {
     this.Tick = quote;
 }