none
Многопоточное программирование RRS feed

  • Вопрос

  • Здравствуйте.

    Есть программа, которая выполняется в основном потоке. С сервера событиями не синхронизировано приходят 3 типа данных (три обработчика событий, один на каждый тип данных). Каждому событию нужно создать свой буфер и свой поток. Вопрос: как это сделать?

    19 сентября 2011 г. 14:52

Ответы

  • Спасибо за ответ.
    Да, реализовано:
    private void SmartServer_AddTick(string symbol, System.DateTime datetime, double price, double volume, string tradeno, StClientLib.StOrder_Action action)
            {
                    //обработка данных
            }
    private void SmartServer_UpdateBidAsk(string symbol, int row, int nrows, double bid, double bidsize, double ask, double asksize)
            {
                    //обработка данных
            }
    private void SmartServer_UpdateQuote(string symbol, System.DateTime datetime, double open, double high, double low, double close,
    double last, double volume, double size, double bid, double ask, double bidsize, double asksize, double open_int, double go_buy,
    double go_sell, double go_base, double go_base_backed, double high_limit, double low_limit, int trading_status) { //обработка данных }
    Техподдержка рекомендует делать так:
    нужно использовать буфер в данном случае
    создаёте класс Tick, затем на его основе список, в событии добавляете новый тик в буфер, например, так
    void SmartCOM_AddTick(..)
    {
    Monitor.Enter(МойБуфер);
    МойБуфер.Add(new Tick(...));
    Monitor.Exit(МойБуфер);
    }
    так же запускаете в отдельном потоке обработку этого буфера
    Thread(Scan).Start();
    void Scan()
    {
    if(Monitor.TryEnter(МойБуфер))
    {
    // берём первый элемент, обрабатываем и удаляем его из списка
    Monitor.Exit(МойБуфер);
    }
    }
    Ссылки, которые Вы мне дали не очень похожи на рекомендацию техподдержки. Не пойму как это целиком будет выглядеть.
    • Изменено 4dimuser 20 сентября 2011 г. 13:29
    • Помечено в качестве ответа Abolmasov Dmitry 28 сентября 2011 г. 6:53
    20 сентября 2011 г. 13:29

Все ответы

  • Здравствуйте.

    Т.е. обработчики событий и разделение событий у вас уже реализовано? Тогда в чем проблема в обработкиче создать новый Thread и передать ему нужные данные через Thread - конструктор (ParameterizedThreadStart)

    Посмотрите - Работа с потоками (C# и Visual Basic)


    Для связи [mail]
    20 сентября 2011 г. 7:02
  • Спасибо за ответ.
    Да, реализовано:
    private void SmartServer_AddTick(string symbol, System.DateTime datetime, double price, double volume, string tradeno, StClientLib.StOrder_Action action)
            {
                    //обработка данных
            }
    private void SmartServer_UpdateBidAsk(string symbol, int row, int nrows, double bid, double bidsize, double ask, double asksize)
            {
                    //обработка данных
            }
    private void SmartServer_UpdateQuote(string symbol, System.DateTime datetime, double open, double high, double low, double close,
    double last, double volume, double size, double bid, double ask, double bidsize, double asksize, double open_int, double go_buy,
    double go_sell, double go_base, double go_base_backed, double high_limit, double low_limit, int trading_status) { //обработка данных }
    Техподдержка рекомендует делать так:
    нужно использовать буфер в данном случае
    создаёте класс Tick, затем на его основе список, в событии добавляете новый тик в буфер, например, так
    void SmartCOM_AddTick(..)
    {
    Monitor.Enter(МойБуфер);
    МойБуфер.Add(new Tick(...));
    Monitor.Exit(МойБуфер);
    }
    так же запускаете в отдельном потоке обработку этого буфера
    Thread(Scan).Start();
    void Scan()
    {
    if(Monitor.TryEnter(МойБуфер))
    {
    // берём первый элемент, обрабатываем и удаляем его из списка
    Monitor.Exit(МойБуфер);
    }
    }
    Ссылки, которые Вы мне дали не очень похожи на рекомендацию техподдержки. Не пойму как это целиком будет выглядеть.
    • Изменено 4dimuser 20 сентября 2011 г. 13:29
    • Помечено в качестве ответа Abolmasov Dmitry 28 сентября 2011 г. 6:53
    20 сентября 2011 г. 13:29
  • Сделайте так как рекомендует техподдерка. Объявите глобальный буфер (какой-нибудь List или Queue), объявите объект object sync = new object() - просто для синхронизации.

    Добавьте таймер - system.threading.timer и по нему опрашивайте список на наличие объектов, если есть - то выполняйте с ними действия и соответсвенно удаляйте из списка. Таймер работает в отдельном потоке, так что проблем быть не должно. Или создавайте на каждый объект новый поток (но тогда буфер теряет смысл).

    Когда работаете с буфером, т.е. с разделяемым объектом, то нужно выполнять синхронизацию, т.е. как вам описали использовать Monitor или используйте lock.


    Для связи [mail]
    22 сентября 2011 г. 6:45
  • Я правильно понимаю сам смысл буфера? Т.е. поступает пакет данных, обрабатывается в обработчике какое-то время (например 0,001 мс). Если в течение этого времени приходит новый пакет, а старый еще не успел обработаться, то он добавляется в буфер и извлекается из него как только первый пакет полностью пройдет код обработчика.

    • Изменено 4dimuser 25 сентября 2011 г. 17:21
    24 сентября 2011 г. 6:55
  • Да, в этом и заключается смысл, если у вас всего 1 рабочий поток, который обрабатывает приходящие пакеты.


    Для связи [mail]
    27 сентября 2011 г. 13:14