Доброе время суток!
Пишу консольное приложение в Delphi, слушаю порт UDP посредством IdUDPServer.
Задумка: когда получаю входящее сообщение, оно записывается в очередь команд для выполнения.
В ходе работы программы создаю TUDPServer, и при наличии возможности выполнить команду (активна метка "ожидание приказов" и есть задания в очереди) запускается соответствующая процедура.
Проблема состоит в том, что пока выполняется эта процедура по обработке команды, программа не может выполнять сопутствующие прослушке UDP действия (Application не создаётся, и, как следствие - нельзя использовать ProcessMessages)
Какие существуют хорошие решения в подобных случаях?
Другие языки программирования и технологии
[Delphi] консольное приложение, UDP
выделяй в отдельный поток сервер или задания.
Тагир Нагуманов
Вы имеете в виду TStream или TThread?
Я тоже плюсую сервис.
Если некоторые действия нужно осуществлять ПАРАЛЛЕЛЬНО, то вам придётся создать дополнительную нить. И заняться синхронизацией.
Вы хотите, чтобы одна нить выполняла команды от другой нити, при этом команды должны выполняться в порядке поступления и независимо от того, чем занимается основная нить.
Можно вводить дополнительные элементы синхронизации, но есть ещё одна возможность: использование очереди сообщений нити (каждая нить имеет свою очередь сообщений, но в явном виде это практически не используется).
Для отправки сообщений нити используется API-функция PostThreadMessage.
Для получения сообщения нить должна устроить внутри себя цикл из GetMessage или PeekMessage с вызовом конкретного обработчика.
Сейчас на руках нет примера, но такой механизм обработки команд мною был реализован в одной из программ.
Вы хотите, чтобы одна нить выполняла команды от другой нити, при этом команды должны выполняться в порядке поступления и независимо от того, чем занимается основная нить.
Можно вводить дополнительные элементы синхронизации, но есть ещё одна возможность: использование очереди сообщений нити (каждая нить имеет свою очередь сообщений, но в явном виде это практически не используется).
Для отправки сообщений нити используется API-функция PostThreadMessage.
Для получения сообщения нить должна устроить внутри себя цикл из GetMessage или PeekMessage с вызовом конкретного обработчика.
Сейчас на руках нет примера, но такой механизм обработки команд мною был реализован в одной из программ.
Да открой ты старый добрый TServerSocket на TCP порту, в детстве на 6-7 дельфе кто его только не юзал. К нему цепляется любое количество TClientSocket, подключения, прием сообщения и отправка - у всего есть события, прогу делаешь без формы или если TThread создавать лень - форму прячешь на первом этапе запуска и биндишь на хитрый клавиатурный аккорд (в отладке поможет, или это будет секретный вызов проги для своих) а дальше можно сделать чат, который по твоему протоколу может управлять компом которому пишешь (например @#!#OPENCD#!#@ - прога в чате не выводит а выдвигает у соседа сидюк, или делает скриншот рабочего стола и в новом окне без рамки выводит поверх десктопа. В гугле набери delphi tserversocket примеров - навалом. А про мышь - delphi global mouse keyboard hook (не факт, что глобальные хуки получится в 7-10 винде запустить, а так можно было и без драйверов перехватывать системные вызовы API, подменяя функцию, а дальше - полет фантазии.
Тагир Нагуманов
Спасибо, за год с момента задания вопроса много вещей узнал и полностью отказался от всех видов Indy как раз в пользу ServerSocket/ClientSocket. Окончательно пришлось отказаться, когда Indy систематически сбоил при взаимодействии компьютеров под управлением разных операционных систем, а ServerSocket может порой заерундить только при дисконнектах, что в моих задачах совершенно не критично.
что значит консольное приложение.. оно будет висеть и все время ждать, или выполнив определенную команду вернет управление cmd?
употребляя серверный компонент ты фактически пытаешься сделать сервис. Т. е. нужно использовать компоненты для оформления сервисав Дельфи.
Я писал простенькое консольное приложение, но udp-клиент, которое посылая строку, заканчивало работу.
употребляя серверный компонент ты фактически пытаешься сделать сервис. Т. е. нужно использовать компоненты для оформления сервисав Дельфи.
Я писал простенькое консольное приложение, но udp-клиент, которое посылая строку, заканчивало работу.
Тагир Нагуманов
Висит посредством работы с UDP сервером:
with TUDPServer.Create do
try
repeat
if not Busy then if SL.Count > 0 then
begin
Busy := True;
GoExecute(SL.Strings[0]);
SL.Delete(0);
end;
Sleep(20);
until ExitFlag;
finally
...
То есть работает до тех пор, пока переменная ExitFlag не примет значение True
with TUDPServer.Create do
try
repeat
if not Busy then if SL.Count > 0 then
begin
Busy := True;
GoExecute(SL.Strings[0]);
SL.Delete(0);
end;
Sleep(20);
until ExitFlag;
finally
...
То есть работает до тех пор, пока переменная ExitFlag не примет значение True
Тагир Нагуманов
Всё работает как надо, пока время между отправкой UDP-посылок к этому приложению больше времени выполнения рабочей процедуры GoExecute
Похожие вопросы
- c#. Сортировка массива в отдельном методе. Консольное приложение.
- с++ для чего вообще нужны консольные приложения?
- Работаю в Visua C++ 2008. консольное приложение Win32/
- почему изначально изучают С++ консольных приложений? и какую библиотеку выбрать потом для создания GUI
- Консольное приложение C#, программисты, выручайте)
- C++. Как создать Пустой проект консольного приложения Win32? После обновления VS не знаю как создать
- Нужно создать консольное приложение на языке С++ в visual studio 2017. Помогите, прошу !
- PHP и UDP-сервер: Проблема с приёмом информации
- Помогоите с UDP сокетами! (с++)
- Какие приложения можно создать на Delphi? Я начал изучать Delphi, что можно создать и взять это как стремление