0 / 0 / 0
Регистрация: 03.08.2017
Сообщений: 18
|
|
1 | |
Как правильно использовать разделяемый ресурс разными клиентами из программы?08.09.2017, 19:11. Показов 653. Ответов 7
Метки нет (Все метки)
Здравствуйте. В программе есть несколько ресурсов, которые в один момент времени могут обслуживать только одного клиента (ком-порт с помощью ComDrv32, обращение к sqlite, отображение и ввод информации из основного потока UI). Как правильно сделать так, чтобы разные клиенты могли обращаться к одному и тому же ресурсу, и получать от него информацию, не мешая друг другу?
Сейчас всё в главном UI потоке. В ComDrv32, например, разные клиенты по очереди отправляют запрос, выжидается некоторое время с помощью нескольких последовательных Sleep(1), затем проверяется, словил ли компонент ответ, если да, он отдаётся клиенту, если нет, то ставится признак, что ответ не пришёл. Правильно всё это делать как-то через потоки, очереди сообщений видимо, семафоры, критические секции.. Скажите, пожалуйста, где можно хорошо подробно почитать о подобном? Желательно с примерами. Или, может быть, кто-нибудь может вкратце объяснить, опять же, с простейшим примером? Т.е. в идеале видится такое. Есть клиент (экземпляр класса). Его извне дёрнули за метод — шли, мол, данные в ком-порт. Он отправил данные компоненту ком-порта (скорее, как-то записал в некий промежуточный класс-очередь, видимо). И через какое-то время получил от компонента-очереди ответ, либо уведомление о истечении таймаута. И это нужно для нескольких экземпляров одного класса. И то же для других разделяемых ресурсов. Как такое правильно делать?
0
|
08.09.2017, 19:11 | |
Ответы с готовыми решениями:
7
Можно ли включить библиотеку в тело (ресурс) программы и использовать её оттуда? Как правильно создать и использовать radiobutton? Можно ли из программы узнать версию Windows ? @mail письма под разными почтовыми клиентами Как правильно настроить общий ресурс. |
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 | |||||
Спасибо! А вы можете проиллюстрировать почту минимальным кодом? Не могу вот понять, как эти объекты реального мира перевести в экземпляры объектов, потоки и прочая.
Да, ошибся, спасибо. Удобный компонент-обёртка над апи-работой с компортом. http://www.atbcode.com/code/2prb8xsj-1269323-down Для передачи данных и получения ответов на них используется примерно такая конструкция (RS485 — экземпляр класса ComDrv32):
0
|
10.09.2017, 21:27 | 5 | |||||||||||||||
один раз глобальную переменную
далее по месту надобности
1
|
0 / 0 / 0
Регистрация: 03.08.2017
Сообщений: 18
|
|
15.11.2018, 07:07 [ТС] | 6 |
Спасибо!
А что происходит с потоком, вызывающим критическую секцию, занятую другим потоком? Он будет бесконечно ожидать её освобождения? Что, если таких потоков несколько? Они все будут ожидать, затем по освобождению один из них (какой?) её займёт и т.д.?
0
|
0 / 0 / 0
Регистрация: 03.08.2017
Сообщений: 18
|
|
15.11.2018, 14:13 [ТС] | 8 |
Спасибо
0
|
15.11.2018, 14:13 | |
15.11.2018, 14:13 | |
Помогаю со студенческими работами здесь
8
Как извлечь из программы ресурс Как правильно использовать стек, использовать вершину стека и т.п Как использовать С исходник с двумя разными Хидерами Как можно использовать String с разными функциями Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |