Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.10.2013, 11:08   #1
Smallboy
Пользователь
 
Регистрация: 16.07.2013
Сообщений: 28
По умолчанию Реализация параллельной работы

Доброе утро!
У меня возник вопрос. Пару месяцев назад начал работать с делфи.
Подскажите как реализовать следующую задачу.

Вот как сейчас работает моя программа:
- слушает определенный порт
- если на этот порт приходит запрос от клиента, то обрабатывает этот запрос
- если в момент обработки запроса от клиента приходит еще один запрос, то его необходимо отклонить

Запрос представляет из себя строку с параметрами. Получив эти параметры программа вызывает функцию из Dll,
которая отправляет эти параметры на устройство через COM- порт. Устройство обрабатывает данные и возвращает ответ.

Суть проблемы. Обработка данных устройством занимает 15-20 секунд, и в это время все запросы приходящие на порт, который слушается -- становятся в очередь и не обрабатываются пока не отработает функция. Это не допустимо. Необходимо, чтобы в случае занятости -- клиент сразу получал ответ. Как наладить параллельную работу
прослушки порта и остальной работы программы?

Вот участок кода, который обрабатывает запросы:

Код:
if ServerSocket.Socket.ActiveConnections = 1 then
    begin
       //тут читаем параметры запроса
      CheckRequest; // обрабатывает запрос (15-20 секунд);
      GetParam:='';
      exit;
    end
    else
    begin
      ServerSocket.Socket.Connections[ServerSocket.Socket.ActiveConnections-1].SendText('Сервер не доступен');
      Application.ProcessMessages;
      Buffer.Lines.Insert(0,'Отключаем лишний коннект');
      Application.ProcessMessages;
      ServerSocket.Socket.Connections[ServerSocket.Socket.ActiveConnections-1].Close;
      Application.ProcessMessages;
      ConNum;
    end;
Smallboy вне форума Ответить с цитированием
Старый 21.10.2013, 11:14   #2
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

Цитата:
Обработка данных устройством занимает 15-20 секунд
этот чтож за устройство такое?

а Application.ProcessMessages; зачем?

а ваще вся это кухня должна работать в доп. потоке
eval вне форума Ответить с цитированием
Старый 21.10.2013, 11:23   #3
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

что за обработка такая?
понятно что com не разделяемый ресурс, но и в одну очередь не вариант...
есть такая штука TMultiReadExclusiveWriteSynchronise r. может логику на нем построить
или кешировать ответы
Не стесняемся, плюсуем!

Последний раз редактировалось Slym; 21.10.2013 в 11:40.
Slym вне форума Ответить с цитированием
Старый 21.10.2013, 11:29   #4
Smallboy
Пользователь
 
Регистрация: 16.07.2013
Сообщений: 28
По умолчанию

Цитата:
Сообщение от eval Посмотреть сообщение
этот чтож за устройство такое?

а Application.ProcessMessages; зачем?

а ваще вся это кухня должна работать в доп. потоке
да какая разница, что за устройство. Оно отправляет данные на удаленный сервер, ждет ответа от него и возвращает ответ программе. Этим занимается dll.

без Application.ProcessMessages форма часто подвисает и не синхронно выводит данные, а лишь в конце работы.

P.s что именно должно работать в потоке и как это реализуется??
(я же написал что всего 2-й месяц работаю с делфи)
Smallboy вне форума Ответить с цитированием
Старый 21.10.2013, 11:32   #5
Smallboy
Пользователь
 
Регистрация: 16.07.2013
Сообщений: 28
По умолчанию

Цитата:
Сообщение от Slym Посмотреть сообщение
что за обработка такая?
понятно что com не разделяемый ресурс, но и в одну очередь не вариант...
есть такая штука TMultiReadExclusiveWriteSynchronise r. может логику на нем построить
дело не в том что COM не разделяемый, а том что при работе функции с COM, должна продолжаться работа с TCP, а именно обработка запросов и
ответы запросам о занятости COM.

P.S. Про TMultiReadExclusiveWriteSynchronise r ничего не нашел(
Smallboy вне форума Ответить с цитированием
Старый 21.10.2013, 11:36   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
P.S. Про TMultiReadExclusiveWriteSynchronise r ничего не нашел(
У меня наверно особенный гугл, находит, надо же
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 21.10.2013, 12:37   #7
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Цитата:
Оно отправляет данные на удаленный сервер, ждет ответа от него и возвращает ответ программе. Этим занимается dll.

без Application.ProcessMessages форма часто подвисает и не синхронно выводит данные, а лишь в конце работы.
раз DLL ждет и не возвращает контроль пока не получит ответа от устройства по COM-порту, то не используйте эту либу, организуйте работу с COM -портом напрямую, или обертками BCOMPORT. Либо отдельным потоком с буферизацией команд.

Использование DLL может быть обусловлено ее поддержкой какого-либо протокола, например производитель предоставляет SDK. Так что эта за DLL ? Не mscomm32 ведь?
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 21.10.2013, 12:40   #8
Smallboy
Пользователь
 
Регистрация: 16.07.2013
Сообщений: 28
По умолчанию

Цитата:
Сообщение от raxp Посмотреть сообщение
раз DLL ждет и не возвращает контроль пока не получит ответа от устройства по COM-порту, то не используйте эту либу, организуйте работу с COM -портом напрямую, или обертками BCOMPORT. Либо отдельным потоком с буферизацией команд.

Использование DLL может быть обусловлено ее поддержкой какого-либо протокола, например производитель предоставляет SDK. Так что эта за DLL ? Не mscomm32 ведь?
Использование DLL может быть обусловлено ее поддержкой какого-либо протокола, например производитель предоставляет SDK

Это именно этот случай.

Сама функция для работы с длл так долго работает. После получения параметров через функцию, устройство отправляет запрос на удаленный сервер, там он обрабатывается (15-20 секунд), после чего
функция возвращает errorcode (успешно выполнена операция или нет). Очень надо чтобы на момент работы участка кода связанного с обработкой запроса и работы функции с устройством программа не прекращала сканирование порта. Она должна продолжать принимать запросы через TCP и отсылать им ответ о занятости устройства. В моем случае клиент получает ответ через 15-20 секунд(после окончания работы с устройством), что не приемлемо долго.

Последний раз редактировалось Smallboy; 21.10.2013 в 12:47.
Smallboy вне форума Ответить с цитированием
Старый 21.10.2013, 12:53   #9
Simply-Art
Программист и
Участник клуба
 
Аватар для Simply-Art
 
Регистрация: 29.10.2006
Сообщений: 1,265
По умолчанию

Попробуйте данные от клиента отправлять в отдельный поток программы (TThread) и когда отправляете ставьте триггер в положение "обработка" в основной программе, а когда поток вернет вам данные, например вызвав какую нибудь функцию из основного потока, то ставьте в ней триггер в положение "свободен". Ну и соответственно когда слушаете порт смотрите, если триггер в положении "свободен", то принимайте данные от пользователя, ну а если "обработка", то отвечайте пользователю, извини я занят, давай ка ты мне попозже отправишь данные.
Надеюсь алгоритм понятен. В этом случае зависает поток обработки, но никак не основной поток программы, и все нормально будет работать.
Simply-Art вне форума Ответить с цитированием
Старый 21.10.2013, 13:03   #10
Smallboy
Пользователь
 
Регистрация: 16.07.2013
Сообщений: 28
По умолчанию

Цитата:
Сообщение от Simply-Art Посмотреть сообщение
Попробуйте данные от клиента отправлять в отдельный поток программы (TThread) и когда отправляете ставьте триггер в положение "обработка" в основной программе, а когда поток вернет вам данные, например вызвав какую нибудь функцию из основного потока, то ставьте в ней триггер в положение "свободен". Ну и соответственно когда слушаете порт смотрите, если триггер в положении "свободен", то принимайте данные от пользователя, ну а если "обработка", то отвечайте пользователю, извини я занят, давай ка ты мне попозже отправишь данные.
Надеюсь алгоритм понятен. В этом случае зависает поток обработки, но никак не основной поток программы, и все нормально будет работать.
я так и думал. Осталось почитать про потоки :-)
Smallboy вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Дана квадратная матрица А порядка М. Найти сумму элементов каждой её диагонали, параллельной побочной(начиная с одноэлементной диа 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