Нужна помощь профессионального программиста - страница 4

 
Vitalii Ananev #:

А сделать парсинг данных в потоке, есть возможность?

Конечно есть,

 if(aState = true) then
        begin
          UpdExpertData();
          OnTick();
        end;

но данные там уже для другого эксперта

Данные передались, а связь между буферами осталась.

Вернулись к тому с чего начиналось

 
prostotrader #:

Если Вы это

https://docwiki.embarcadero.com/RADStudio/Sydney/en/Using_Implements_for_Delegation

имеете ввиду, то есть.

Добавлено

Мне вообще-то все-равно в какой среде писать, просто на Делфи получаются нативные приложения

и привык уже...  К тому же уже все переписано. :)

Имею в виду это

https://metanit.com/sharp/tutorial/3.13.php

У меня все взаимодействие между интерфейсом и потоками, между самими потоками, объектами классов,  сделано через делегаты.

Ничего не "морозится", не тормозит, не крэшится, не... и т.д.)

С# и .NET | Делегаты
  • metanit.com
Делегаты в С# и .NET, их сущность и объявление с помощью ключевого слова delegate и вызов методом Invoke, добавление методов в делегат, обобщенные делегаты
 
prostotrader #:

Конечно есть,

но данные там уже для другого эксперта

Данные передались, а связь между буферами осталась.

Вернулись к тому с чего начиналось

Наверно вы как то не так делаете. Я выше описывал алгоритм как это сделать. 

...

В главном потоке в буфере накапливаются данные. Из буфера пакет данных передается для обработки в соответствующий дочерний поток. Но только при условии, что этот поток отработал предыдущий пакет данных. По идее у вас параллельно должны обрабатываться несколько пакетов данных. Например один поток у вас только газпром обрабатывает если поток ни чем не занят и в буфере есть данные по газпрому отправляем ему пакет данных. Далее следующий поток например Яндекс если он не занят и есть данные шлем ему данные и т.д.  Обработанные данные можно из буфера удалять.

 
Vitalii Ananev #:

Наверно вы как то не так делаете. Я выше описывал алгоритм как это сделать. 

Понятно....

 
Dmitriy Skub #:

Имею в виду это

https://metanit.com/sharp/tutorial/3.13.php

У меня все взаимодействие между интерфейсом и потоками, между самими потоками, объектами классов,  сделано через делегаты.

Ничего не "морозится", не тормозит, не крэшится, не... и т.д.)

Проблема не в взаимодействии между интерфейсом и потоками, окнами и т.д, а в том, что

из главного окна передается буфер в дочернее окно, если сразу не распарсить буфер при его передаче, а сделать это чуть позже в этом буфере появляются уже другие данные.

Вот я и спрашивал, есть ли какой-либо способ, при передаче буфера, сразу "обрубить" концы.

Даже картинку прикладывал.

 
prostotrader #:

Проблема не в взаимодействии между интерфейсом и потоками, окнами и т.д, а в том, что

из главного окна передается буфер в дочернее окно, если сразу не распарсить буфер при его передаче, а сделать это чуть позже в этом буфере появляются уже другие данные.

Вот я и спрашивал, есть ли какой-либо способ, при передаче буфера, сразу "обрубить" концы.

Даже картинку прикладывал.

Что значит "чуть позже"?

Если программа не успевает обрабатывать данные, то это одно. А если буфер перезаписывается из-за отсутствия синхронизации, то это другой вариант.

Например, у меня в обработчике тикового потока используется на входе кольцевой буфер с синхронизацией. Поскольку тики идут не равномерно и не известно заранее как.
 
Dmitriy Skub #:

Что значит "чуть позже"?

Если программа не успевает обрабатывать данные, то это одно. А если буфер перезаписывается из-за отсутствия синхронизации, то это другой вариант.

Например, у меня в обработчике тикового потока используется на входе кольцевой буфер с синхронизацией. Поскольку тики идут не равномерно и не известно заранее как.

Вот что значит "чуть позже"

if(CreateOutData(Child.Expert.FutName, Child.Expert.SpotName, BuffIdx) = true) then // prepare out dada
                    begin
                      Child.OnData(@OutData[BuffIdx]);  //Send data
                      PostMessage(Child.Expert.EHandle, WM_ON_TICK, Child.Expert.EHandle, 0);  //Init OnTick
                    end;

Сначала передается буфер, а потом инициируется его обработка в дочернем окне по PostMessage

Проблему решил, как и говорил ранее сделал свой буфер для каждого дочернего окна

Всем спасибо

И потоки освоил и программа быстро заработала :)

 

Оказалось, что не все :(

Если работают все советники, то наглухо вешается процессор.

Нужно как-то ставить поток в режим ожидания....

 
prostotrader #:

Оказалось, что не все :(

Если работают все советники, то наглухо вешается процессор.

Нужно как-то ставить поток в режим ожидания....

Потокам можно ставить приоритеты. Попробуйте ставить приоритет чуть ниже нормального. Lower вроде называется точно не помню. 

 
Vitalii Ananev #:

Потокам можно ставить приоритеты. Попробуйте ставить приоритет чуть ниже нормального. Lower вроде называется точно не помню. 

Приоритеты тут не причем. Просто Execute "молотит" без конца, тем самым вешает процессор.

Просто нужно организовать паузу внутри Execute (самого потока) WaitForSingleObject(PostEnter, INFINITE);

Чем я сейчас и занимаюсь :)

Пришло сообщение - ворота открылись...

Причина обращения: