|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
21.10.2013, 11:08 | #1 |
Пользователь
Регистрация: 16.07.2013
Сообщений: 28
|
Реализация параллельной работы
Доброе утро!
У меня возник вопрос. Пару месяцев назад начал работать с делфи. Подскажите как реализовать следующую задачу. Вот как сейчас работает моя программа: - слушает определенный порт - если на этот порт приходит запрос от клиента, то обрабатывает этот запрос - если в момент обработки запроса от клиента приходит еще один запрос, то его необходимо отклонить Запрос представляет из себя строку с параметрами. Получив эти параметры программа вызывает функцию из Dll, которая отправляет эти параметры на устройство через COM- порт. Устройство обрабатывает данные и возвращает ответ. Суть проблемы. Обработка данных устройством занимает 15-20 секунд, и в это время все запросы приходящие на порт, который слушается -- становятся в очередь и не обрабатываются пока не отработает функция. Это не допустимо. Необходимо, чтобы в случае занятости -- клиент сразу получал ответ. Как наладить параллельную работу прослушки порта и остальной работы программы? Вот участок кода, который обрабатывает запросы: Код:
|
21.10.2013, 11:14 | #2 | |
Подтвердите свой е-майл
Регистрация: 29.08.2012
Сообщений: 4,011
|
Цитата:
а Application.ProcessMessages; зачем? а ваще вся это кухня должна работать в доп. потоке |
|
21.10.2013, 11:23 | #3 |
Участник клуба
Регистрация: 07.12.2011
Сообщений: 1,025
|
что за обработка такая?
понятно что com не разделяемый ресурс, но и в одну очередь не вариант... есть такая штука TMultiReadExclusiveWriteSynchronise r. может логику на нем построить или кешировать ответы
Не стесняемся, плюсуем!
Последний раз редактировалось Slym; 21.10.2013 в 11:40. |
21.10.2013, 11:29 | #4 | |
Пользователь
Регистрация: 16.07.2013
Сообщений: 28
|
Цитата:
без Application.ProcessMessages форма часто подвисает и не синхронно выводит данные, а лишь в конце работы. P.s что именно должно работать в потоке и как это реализуется?? (я же написал что всего 2-й месяц работаю с делфи) |
|
21.10.2013, 11:32 | #5 | |
Пользователь
Регистрация: 16.07.2013
Сообщений: 28
|
Цитата:
ответы запросам о занятости COM. P.S. Про TMultiReadExclusiveWriteSynchronise r ничего не нашел( |
|
21.10.2013, 11:36 | #6 | |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
Цитата:
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
|
21.10.2013, 12:37 | #7 | |
Старожил
Регистрация: 29.09.2009
Сообщений: 9,713
|
Цитата:
Использование DLL может быть обусловлено ее поддержкой какого-либо протокола, например производитель предоставляет SDK. Так что эта за DLL ? Не mscomm32 ведь?
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation |
|
21.10.2013, 12:40 | #8 | |
Пользователь
Регистрация: 16.07.2013
Сообщений: 28
|
Цитата:
Это именно этот случай. Сама функция для работы с длл так долго работает. После получения параметров через функцию, устройство отправляет запрос на удаленный сервер, там он обрабатывается (15-20 секунд), после чего функция возвращает errorcode (успешно выполнена операция или нет). Очень надо чтобы на момент работы участка кода связанного с обработкой запроса и работы функции с устройством программа не прекращала сканирование порта. Она должна продолжать принимать запросы через TCP и отсылать им ответ о занятости устройства. В моем случае клиент получает ответ через 15-20 секунд(после окончания работы с устройством), что не приемлемо долго. Последний раз редактировалось Smallboy; 21.10.2013 в 12:47. |
|
21.10.2013, 12:53 | #9 |
Программист и
Участник клуба
Регистрация: 29.10.2006
Сообщений: 1,265
|
Попробуйте данные от клиента отправлять в отдельный поток программы (TThread) и когда отправляете ставьте триггер в положение "обработка" в основной программе, а когда поток вернет вам данные, например вызвав какую нибудь функцию из основного потока, то ставьте в ней триггер в положение "свободен". Ну и соответственно когда слушаете порт смотрите, если триггер в положении "свободен", то принимайте данные от пользователя, ну а если "обработка", то отвечайте пользователю, извини я занят, давай ка ты мне попозже отправишь данные.
Надеюсь алгоритм понятен. В этом случае зависает поток обработки, но никак не основной поток программы, и все нормально будет работать. |
21.10.2013, 13:03 | #10 | |
Пользователь
Регистрация: 16.07.2013
Сообщений: 28
|
Цитата:
|
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Дана квадратная матрица А порядка М. Найти сумму элементов каждой её диагонали, параллельной побочной(начиная с одноэлементной диа | Richik123 | Паскаль, Turbo Pascal, PascalABC.NET | 1 | 31.05.2012 16:15 |
TCP/IP параллельной обработки запросов | zhenya.ya | C/C++ Сетевое программирование | 0 | 24.04.2011 21:31 |
Проблема с параллельной работой клиентов | IceExecutioner | SQL, базы данных | 6 | 17.11.2010 16:49 |
Реализация работы с пикселями: | ritm | Общие вопросы Delphi | 15 | 12.01.2009 16:59 |