остановка приложения с потоками (linux консоль)

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

остановка приложения с потоками (linux консоль)

Сообщение Attid » 19.03.2019 13:43:51

Всем привет.

есть у меня демон, работает с потоками

Код: Выделить всё
      ACTThread := TThread.Create(True);
и т.д.



все хорошо, но если запустить программу в консоли то нет возможности прервать ее по ctrl+C и даже killall не справляется только с параметром -s 9

я так понимаю что основной поток умирает, а дополнительные живут. как коректно выйти из этой ситуации ? может стоит какое-то событие отлавливать в основном потоке ? или в дополнительных проверять жизнь основного ?
все они живут в бесконечных циклах, каждый выполняя свою работу.
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2583
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Re: остановка приложения с потоками (linux консоль)

Сообщение Лекс Айрин » 19.03.2019 14:19:31

Attid, тебе нужно заюзать метод onClose( могу ошибаться ) и самому завершить все потоки созданные программой.

Добавлено спустя 1 минуту 6 секунд:
Ах да, если нет подобного метода, то в деструкторе.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: остановка приложения с потоками (linux консоль)

Сообщение Ichthyander » 19.03.2019 14:52:03

Attid писал(а):я так понимаю что основной поток умирает, а дополнительные живут. как коректно выйти из этой ситуации ? может стоит какое-то событие отлавливать в основном потоке ? или в дополнительных проверять жизнь основного ?
все они живут в бесконечных циклах, каждый выполняя свою работу.

Дополнительные потоки должны периодически проверять флаг Terminated (и, возможно Application.TErminated) и выходить из бесконечного цикла, освобождая ресурсы потока. Храните указатели на потоки и останавливайте и освобождайте их в случае закрытия приложения
Аватара пользователя
Ichthyander
постоялец
 
Сообщения: 496
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Re: остановка приложения с потоками (linux консоль)

Сообщение Vadim » 19.03.2019 15:17:31

Ctrl+C или kill - тоже не совсем правильный метод, можно потерять данные или не сделать чего-то нужного. Я делал так: если программа запускается без ключей - она работает по своему основному назначению, если с ключами, то ключ посылает сигнал, например, перечитать инишник или завершить работу. Завершение, естественно, проходит как положено - сохраняются данные, завершаются потоки и т.п....
Vadim
долгожитель
 
Сообщения: 3661
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: остановка приложения с потоками (linux консоль)

Сообщение Ichthyander » 19.03.2019 15:19:48

Vadim писал(а):Ctrl+C или kill - тоже не совсем правильный метод, можно потерять данные или не сделать чего-то нужного. Я делал так: если программа запускается без ключей - она работает по своему основному назначению, если с ключами, то ключ посылает сигнал, например, перечитать инишник или завершить работу. Завершение, естественно, проходит как положено - сохраняются данные, завершаются потоки и т.п....

Ну по хорошему то нужно делать демон в Линукс тогда. Шаблон для создания демонов есть в Лазарус
Аватара пользователя
Ichthyander
постоялец
 
Сообщения: 496
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Re: остановка приложения с потоками (linux консоль)

Сообщение Vadim » 19.03.2019 15:23:14

Ichthyander писал(а):Ну по хорошему то нужно делать демон в Линукс тогда.

Согласен. Если прога работает в невидимом режиме, тогда демон лучше всего. Тем более что в каждой ОСьке есть стандартные средства работы с демонами.
Vadim
долгожитель
 
Сообщения: 3661
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: остановка приложения с потоками (linux консоль)

Сообщение Attid » 19.03.2019 16:24:38

да я раньше делал через демона, и потоки не через нити, а через клонирование текущего потока, но потом что-то там пошло не так и сделал универсально через нити и обычное приложение что б можно было при желании и в венде компилить запускать.
про диструктор посмотрю, спасибо.

Добавлено спустя 3 минуты 18 секунд:
Vadim писал(а):Ctrl+C или kill - тоже не совсем правильный метод, можно потерять данные или не сделать чего-то нужного. Я делал так: если программа запускается без ключей - она работает по своему основному назначению, если с ключами, то ключ посылает сигнал, например, перечитать инишник или завершить работу. Завершение, естественно, проходит как положено - сохраняются данные, завершаются потоки и т.п....

у меня коректный выход, через БД, но вот в момент настройки при первых запусках иногда надо несколько раз перезапустить, и тогда натыкаюсь. а так прога уже несколько лет работает и эта штука не беспокоит, просто недавно опять разворачивал, наткнулся, решил почему бы и не поправить
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2583
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Re: остановка приложения с потоками (linux консоль)

Сообщение Ichthyander » 19.03.2019 17:20:21

Attid писал(а):да я раньше делал через демона, и потоки не через нити, а через клонирование текущего потока, но потом что-то там пошло не так и сделал универсально через нити и обычное приложение что б можно было при желании и в венде компилить запускать.
про диструктор посмотрю, спасибо.

Так я в демоне делал потоки обычным способом, через TThread. Потоки запускаю на событии OnDaemonStart, закрываю на событии OnDaemonStop. И в Лазарусе шаблон демона (не самому делать, а использовать готовый!) кроссплатформенный и универсальный. То есть я компилю и под ВИндоус и под Линукс, хотя мне нужно под линукс
Аватара пользователя
Ichthyander
постоялец
 
Сообщения: 496
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Re: остановка приложения с потоками (linux консоль)

Сообщение Attid » 23.03.2019 12:13:56

Ichthyander писал(а):Так я в демоне делал потоки обычным способом

Я вспомнил почему демон не хотел. у меня прога конфигурируется ключами. и интерактивно в консоли, потом сохраняет настройки в шифрованый файл. тогда мне отдельный конфигаратор надо делать. что в принципе не критично, но лишняя приблуда не хотелось бы.

Добавлено спустя 1 минуту 47 секунд:
Vadim писал(а):Ctrl+C или kill - тоже не совсем правильный метод, можно потерять данные или не сделать чего-то нужного. Я делал так: если программа запускается без ключей - она работает по своему основному назначению, если с ключами, то ключ посылает сигнал, например, перечитать инишник или завершить работу. Завершение, естественно, проходит как положено - сохраняются данные, завершаются потоки и т.п....

а сообщение через что посылаешь ?

Добавлено спустя 2 минуты 2 секунды:
вариант TThread.onterminate не подходит первый поток то у меня не TThread. тут или хуки ставить и системные сообщения ловить, или реально из нитей отпрашивать главный поток.
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2583
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Re: остановка приложения с потоками (linux консоль)

Сообщение olegy123 » 23.03.2019 12:35:28

Attid писал(а):все хорошо, но если запустить программу в консоли то нет возможности прервать ее по ctrl+C и даже killall не справляется только с параметром -s 9

демон умеет ловить сигналы?
Attid писал(а):я так понимаю что основной поток умирает, а дополнительные живут. как коректно выйти из этой ситуации ?

как обычно - ставить в потоках условия, переходы.
Attid писал(а):может стоит какое-то событие отлавливать в основном потоке ? или в дополнительных проверять жизнь основного ?
если основной отваливается то как он будет контролировать?
olegy123
энтузиаст
 
Сообщения: 1456
Зарегистрирован: 25.02.2016 12:10:20

Re: остановка приложения с потоками (linux консоль)

Сообщение Лекс Айрин » 23.03.2019 13:26:49

olegy123, вообще-то в лёгкую отлавливается. Просто так программу редко рубят в жёсткую.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: остановка приложения с потоками (linux консоль)

Сообщение Vadim » 23.03.2019 14:07:23

Attid писал(а):а сообщение через что посылаешь ?

Программа чисто линуксовая, поэтому сообщение посылается в виде номера через системную функцию kill(). В приёмной части, в зависимости от номера посланного сигнала, происходит обработка.
Vadim
долгожитель
 
Сообщения: 3661
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: остановка приложения с потоками (linux консоль)

Сообщение Attid » 23.03.2019 19:17:49

Vadim писал(а):Программа чисто линуксовая, поэтому сообщение посылается в виде номера через системную функцию kill(). В приёмной части, в зависимости от номера посланного сигнала, происходит обработка.

принимает какая команда ? или кусочек кода если можно .
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2583
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Re: остановка приложения с потоками (linux консоль)

Сообщение Дож » 23.03.2019 19:57:08

Аватара пользователя
Дож
энтузиаст
 
Сообщения: 798
Зарегистрирован: 12.10.2008 16:14:47

Re: остановка приложения с потоками (linux консоль)

Сообщение olegy123 » 23.03.2019 23:56:25

Attid писал(а):принимает какая команда ? или кусочек кода если можно .

https://programjutsu.wordpress.com/2010 ... %B2-linux/
olegy123
энтузиаст
 
Сообщения: 1456
Зарегистрирован: 25.02.2016 12:10:20

След.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

Рейтинг@Mail.ru