예제 #1
0
            public void Open()
            {
                _messageQueue.Open();

                ThreadingHelper
                .Thread(() => CultureInfo.InvariantCulture.DoInCulture(() =>
                {
                    while (!_messageQueue.IsClosed)
                    {
                        try
                        {
                            var sended    = _historyMessageAdapter.SendOutMessage();
                            var processed = false;

                            while (_messageQueue.TryDequeue(out var message, true, false))
                            {
                                NewOutMessage?.Invoke(message);
                                processed = true;
                            }

                            if (!sended && !processed && !_messageQueue.IsClosed)
                            {
                                Thread.Sleep(100);
                            }
                        }
                        catch (Exception ex)
                        {
                            _errorHandler(ex);
                        }
                    }
                }))
                .Name("History emulation channel thread.")
                .Launch();
            }
예제 #2
0
            public void Open()
            {
                _messageQueue.Open();

                ThreadingHelper
                .Thread(() => CultureInfo.InvariantCulture.DoInCulture(() =>
                {
                    while (!_messageQueue.IsClosed)
                    {
                        try
                        {
                            var sended = _historyMessageAdapter.SendOutMessage();

                            Message message;

                            if (!_messageQueue.TryDequeue(out message, true, !sended))
                            {
                                if (!sended)
                                {
                                    break;
                                }
                            }
                            else
                            {
                                NewOutMessage?.Invoke(message);
                            }
                        }
                        catch (Exception ex)
                        {
                            _errorHandler(ex);
                        }
                    }
                }))
                .Name("History emulation channel thread.")
                .Launch();
            }
예제 #3
0
        private void OnLoad()
        {
            try
            {
                var messageTypes = new[] { MessageTypes.Time, ExtendedMessageTypes.Clearing };
                var token        = _cancellationToken.Token;

                while (!token.IsCancellationRequested)
                {
                    _syncRoot.WaitSignal();
                    _messageQueue.Clear();
                    _messageQueue.Open();

                    _isInitialized = true;
                    _isChanged     = false;

                    _moveNextSyncRoot.PulseSignal();

                    foreach (var action in _actions.CopyAndClear())
                    {
                        if (action.Item2)
                        {
                            _basketStorage.InnerStorages.Add(action.Item1);
                        }
                        else
                        {
                            _basketStorage.InnerStorages.Remove(action.Item1);
                        }
                    }

                    var boards    = Boards.ToArray();
                    var loadDate  = _currentTime != DateTimeOffset.MinValue ? _currentTime.Date : StartDate;
                    var startTime = _currentTime;

                    while (loadDate.Date <= StopDate.Date && !_isChanged && !token.IsCancellationRequested)
                    {
                        if (boards.Length == 0 || boards.Any(b => b.IsTradeDate(loadDate, true)))
                        {
                            this.AddInfoLog("Loading {0}", loadDate.Date);

                            var messages = _basketStorage.Load(loadDate.UtcDateTime.Date);

                            // storage for the specified date contains only time messages and clearing events
                            var noData = !messages.DataTypes.Except(messageTypes).Any();

                            if (noData)
                            {
                                EnqueueMessages(loadDate, startTime, token, GetSimpleTimeLine(loadDate));
                            }
                            else
                            {
                                EnqueueMessages(loadDate, startTime, token, messages);
                            }
                        }

                        loadDate = loadDate.Date.AddDays(1).ApplyTimeZone(loadDate.Offset);
                    }

                    if (!_isChanged)
                    {
                        EnqueueMessage(new LastMessage {
                            LocalTime = StopDate
                        });
                    }

                    _isInitialized = false;
                }
            }
            catch (Exception ex)
            {
                EnqueueMessage(ex.ToErrorMessage());
                EnqueueMessage(new LastMessage {
                    IsError = true
                });
            }
        }