Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 03.08.2017
Сообщений: 18
1

Как правильно использовать разделяемый ресурс разными клиентами из программы?

08.09.2017, 19:11. Показов 653. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте. В программе есть несколько ресурсов, которые в один момент времени могут обслуживать только одного клиента (ком-порт с помощью ComDrv32, обращение к sqlite, отображение и ввод информации из основного потока UI). Как правильно сделать так, чтобы разные клиенты могли обращаться к одному и тому же ресурсу, и получать от него информацию, не мешая друг другу?
Сейчас всё в главном UI потоке. В ComDrv32, например, разные клиенты по очереди отправляют запрос, выжидается некоторое время с помощью нескольких последовательных Sleep(1), затем проверяется, словил ли компонент ответ, если да, он отдаётся клиенту, если нет, то ставится признак, что ответ не пришёл.
Правильно всё это делать как-то через потоки, очереди сообщений видимо, семафоры, критические секции.. Скажите, пожалуйста, где можно хорошо подробно почитать о подобном? Желательно с примерами. Или, может быть, кто-нибудь может вкратце объяснить, опять же, с простейшим примером?
Т.е. в идеале видится такое. Есть клиент (экземпляр класса). Его извне дёрнули за метод — шли, мол, данные в ком-порт. Он отправил данные компоненту ком-порта (скорее, как-то записал в некий промежуточный класс-очередь, видимо). И через какое-то время получил от компонента-очереди ответ, либо уведомление о истечении таймаута. И это нужно для нескольких экземпляров одного класса. И то же для других разделяемых ресурсов.
Как такое правильно делать?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.09.2017, 19:11
Ответы с готовыми решениями:

Можно ли включить библиотеку в тело (ресурс) программы и использовать её оттуда?
Хочу включить библиотеку в тело программы и использовать её от туда. Если это возможно подскажите...

Как правильно создать и использовать radiobutton? Можно ли из программы узнать версию Windows ?
Здравствуйте. Как правильно создать и использовать элементы radiobutton ? Если я просто создам...

@mail письма под разными почтовыми клиентами
Всем привет. Есть проблема в отображении письма в разных почтовых клиентах, особенно в стандартных...

Как правильно настроить общий ресурс.
Уважаемые, подскажите пожалуйста, какие права нужно дать на корень шары, чтобы она монтировалась,...

7
5786 / 4528 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
08.09.2017, 22:49 2
тут дело даже не в самой технологии, а в т.н. "паттерне"
вам нужно придумать некую архитектуру, как это все будет работать
в интернетах например все работает с задержкой, поэтому запрос никогда не ждет ответ

можно придумать например так
есть объект - туалетная комната. использовать ее можно по нескольким сценариям
например, простое
1. проверить, свободно ли
2. если свободно, перевести в состояние занято. делать свои дела. отпустить
3. если занято, подождать N мсек, и начать сначала
вариант 2
1. встать в очередь
2. туалет постоянно мониторит очередь.
3. если свободно, он послает вызов первому клиенту из очерели - делать свои дела
4. как только клиент доделал, он возвращает управление туалету, и тот идет к п2

варианты 1 и 2 предполагают что клиент выполняет действие от начала до конца. т.е. синхронно
при связи с внешними источниками это неудобно

вариант 3 "почта"
1. Встать в очередь на отправление письма
2. если очередь подошла, почта приглашает вас и забирает ваше письмо. Вы уходите. номер телефона по-прежнему остается на почте
3. когда либо таймаут либо пришел ответ, вас вызовут опять, и вы заберете ответ
4. как только почта находится в состоянии "свободно", идти на п.2

вот примерно так рассуждая, вы получите все нужные варианты
0
пофигист широкого профиля
4733 / 3167 / 859
Регистрация: 15.07.2013
Сообщений: 18,252
09.09.2017, 02:07 3
Одно замечание к топику.
"ком-порт" - неразделяемый ресурс. Не знаю что такое ComDrv32, поэтому не знаю как это "В ComDrv32, например, разные клиенты по очереди отправляют запрос, выжидается некоторое время с помощью нескольких последовательных Sleep(1), затем проверяется, словил ли компонент ответ, если да, он отдаётся клиенту, если нет, то ставится признак, что ответ не пришёл." работает.
0
0 / 0 / 0
Регистрация: 03.08.2017
Сообщений: 18
10.09.2017, 16:09  [ТС] 4
Цитата Сообщение от krapotkin Посмотреть сообщение
тут дело даже не в самой технологии, а в т.н. "паттерне" ...
Спасибо! А вы можете проиллюстрировать почту минимальным кодом? Не могу вот понять, как эти объекты реального мира перевести в экземпляры объектов, потоки и прочая.

Цитата Сообщение от northener Посмотреть сообщение
Одно замечание к топику.
"ком-порт" - неразделяемый ресурс.
Да, ошибся, спасибо.

Цитата Сообщение от northener Посмотреть сообщение
Не знаю что такое ComDrv32 ...
Удобный компонент-обёртка над апи-работой с компортом. http://www.atbcode.com/code/2prb8xsj-1269323-down

Для передачи данных и получения ответов на них используется примерно такая конструкция (RS485 — экземпляр класса ComDrv32):
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    RS485.SendData(pData, len);
    result := ERROR;
    for msTimeout := 1 to data.timeout do
    begin
        if RS485.CountRX = data.expectedRXlen then
        begin
            pData := @data.RXbuf;
            RS485.ReadData(pData, RS485.CountRX);
            result := SEND_OK;
            Break;
        end;
 
        if msTimeout = data.timeout then
            Break;
 
        Sleep(1);
    end;
И функция с этой конструкцией вызывается в процедуре по срабатыванию TTimer по циклу всеми клиентами, кому нужно прочитать/записать данные в основном UI потоке. Как сделать это правильнее?
0
5786 / 4528 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
10.09.2017, 21:27 5
один раз глобальную переменную
Delphi
1
CS:=TCriticalSection.Create;
....
далее по месту надобности
Delphi
1
2
3
4
5
6
cs.enter;
try
  doWhateverYouWant();
finally
  CS.Leave;
end;
ну и
Delphi
1
cs.free;
1
0 / 0 / 0
Регистрация: 03.08.2017
Сообщений: 18
15.11.2018, 07:07  [ТС] 6
Спасибо!
А что происходит с потоком, вызывающим критическую секцию, занятую другим потоком? Он будет бесконечно ожидать её освобождения? Что, если таких потоков несколько? Они все будут ожидать, затем по освобождению один из них (какой?) её займёт и т.д.?
0
5786 / 4528 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
15.11.2018, 14:08 7
поток будет ждать, пока КС не освободится
любой
1
0 / 0 / 0
Регистрация: 03.08.2017
Сообщений: 18
15.11.2018, 14:13  [ТС] 8
Спасибо
0
15.11.2018, 14:13
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.11.2018, 14:13
Помогаю со студенческими работами здесь

Как извлечь из программы ресурс
Как извлечь из exe ресурс и сохранить его как 1.txt

Как правильно использовать стек, использовать вершину стека и т.п
Научите пожалуйста правильно использовать стек, использовать вершину стека и т.п. Просто стек очень...

Как использовать С исходник с двумя разными Хидерами
к примеру имеется .с исходник, где прописаны: #define Исходник SW_DOUT_PIN = 1; ...

Как можно использовать String с разными функциями
Для чайников: string с strlen, strcat, strcmp тд Они не работают с string только с char.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru