Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
kreator писал(а): Я не понимаю вот это. Если пользователь работает, то он не может одновременно работать в двух процедурах.
Ясно. Процесс примерно происходит так.
Программа получает через, скажем, интернет исходные данные. На основании которых ранее описанная "главная", если ее можно так назвать, процедура производит определенного рода расчеты и помещает результаты в эту самую пресловутую глобальную очередь.
Далее множество процедур, обращаясь за этими данными к глобальной очереди, интерпретируют их в сфере своих специфик.
Все это происходит без участия оператора.
Т.е. предлагается вместо очереди использовать tps-файл?
А если задача окажется (какой она и является) немного сложнее?
Что если пользователи через интернет (или просто локальную сеть) провоцируют запуск ниже описанного механизма (получение исходных данных - их обработка - и множественная их интерпретация)? Справится ли с такой ситуацией реализация, основанная на tps-файле, при учете что пользователи могут обращаться к программе в том числе и одновременно?
В таком случае мне представляется здравой идея вернуться к рассмотрению идеи, предложенной kreator, использовать для каждого процесса, инициализированного каждым пользователем, своей версией глобальной очереди, создаваемой посредством параметра Thread.
Последний раз редактировалось NewUser 31 Март 2016, 13:23, всего редактировалось 2 раза.
Вообще-то идея с tps-технологией мне понравилась. Вот как, оказывается, бывает. Вышел на форум с одним вопросом, а получил направление для раздумий совсем в другую сторону.
Дед Пахом писал(а): TPS вполне себе потокобезопасный, в отличие от глобальной очереди, и никакие критические секции не нужны (а в 6.3 для их поддержки вообще ничего нет).
А как на счет скорости? По сравнению с очередью заметной будет разница?
Это в зависимости в первую очередь от количества записей, и во вторую от того, что с ними делать.
Для пущей скорости можно прикрутить IMDB-драйвер -- чтобы таблица сидела полностью в оперативке, и при этом манипулировалась обычными табличными операциями INSERT/UPDATE/DELETE.
Последний раз редактировалось Shur 31 Март 2016, 16:03, всего редактировалось 1 раз.
Если только одна процедура помещает данные в глобальную очередь, а остальные только читают, то какая проблема? Если нужно заблокировать очередь на время обновления, то это другой вопрос.
NewUser писал(а): В таком случае мне представляется здравой идея вернуться к рассмотрению идеи, предложенной kreator, использовать для каждого процесса, инициализированного каждым пользователем, своей версией глобальной очереди, создаваемой посредством параметра Thread.
Подвох здесь в том, что триды будут видеть свои ПУСТЫЕ экземпляры очереди. К сожалению, это лишь объявление очереди, но не копирование её содержимого. И вы возвращаетесь к subj: как создать копии? И ответ известен -- loop'ом.
Последний раз редактировалось Shur 31 Март 2016, 16:09, всего редактировалось 1 раз.
kreator писал(а): Если только одна процедура помещает данные в глобальную очередь, а остальные только читают, то какая проблема? Если нужно заблокировать очередь на время обновления, то это другой вопрос.
Проблема в том, что у глобальной очереди ровно один буфер записи. Если одна задача хочет запись номер 1, а другая одновременно запись номер 2 - будут проблемы. Как раз критические секции, мьютексы и всё такое позволяют делать операции доступа атомарными.
Собственно, я считал так же, но время от времени получал внезапные ошибки на ровном месте.
А чем вариант с мьютексами плох?
Yufil писал(а):Проблема в том, что у глобальной очереди ровно один буфер записи. Если одна задача хочет запись номер 1, а другая одновременно запись номер 2 - будут проблемы.
Тогда, действительно, проще всего тупо копировать глобальную в локальную и работать с локальной. Хрен с этой памятью, её сейчас немерено.
Добрый день.
Не знаю, насколько я правильно понял вопрос. Если речь про диспетчеризацию задач между обработчиками в разных тредах, то я такое делал через классы. В фрейме создается экземпляр класса-диспетчера. Приложение слушает порт. При получении сообщения в очереди диспетчера создается запись-задание с некоторой long-переменной. Стартует обработчик в отдельном потоке, на вход ему передается адрес этой long-переменной. В обработчике инициализируется локальный класс-обработчик, его адрес присваивается переданной переменной. Ну а дальше класс-диспетчер, который крутится во фрейме, может считывать информацию, которую размещает обработчик по мере выполнения задания. Выполнил задание, выставил флажок. Диспетчер получил запрос извне о состоянии задания, проверил статус, если выполнено, отправил результат и отметил, что обработчик в ожидании. При последующих запросах извне вначале проверяются запущенные обработчики, если есть свободные, задание передается им, если все заняты, стартует новый экземпляр в новом треде...
Дед Пахом писал(а):В том-то и фишка, что пока ты тупо копируешь, кто-то другой тупо её меняет.
Если меняет одна процедура, то она может выставить некий флаг на время изменения. Я как понял задачу? Некая одна процедура заполняет глобальную очередь периодически, скорее всего полностью обновляет. Другие процедуры пользуются этими данными, возможно всеми. Т.е. моя мысль - заменить эту глобальную очередь базой данных (тем же tps) ничего не даст. Нарвёмся на те же грабли, только быстрее, потому что работа с tps будет медленнее.