Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Самоуничтожающийся объект / 25 сообщений из 29, страница 1 из 2
16.03.2021, 15:19
    #40054068
hlopotun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Самоуничтожающийся объект
Всем добрый день,

при старте программы надо создать объект который после создания, параллельно старту программы, выполнит определённые действия и по завершению самоуничтожится.
Напрашивается идея создания thread, но как обеспечить его самоуничтожение? Наследовать интерфейс? но при выходе из процедуры где он создаётся он начнёт уничтожаться, не факт что при этом он закончит свою работу, соотв. получим исключение.

Подскажите идею как лучше реализовать такой объект.
Спасибо.
...
Рейтинг: 0 / 0
16.03.2021, 15:25
    #40054072
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Самоуничтожающийся объект
автори по завершению самоуничтожится.
По завершению ЧЕГО ? Программы или собственных действий ?

авторНапрашивается идея создания thread, но как обеспечить его самоуничтожение
FreeOnTerminate
...
Рейтинг: 0 / 0
16.03.2021, 15:31
    #40054079
cptngrb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Самоуничтожающийся объект
thread - FreeOnTerminate
object - создал там где захочешь, уничтожил там где захочешь.
В смысле не факт что при этом он закончит свою работу , без доп. потоков ты дальше не двинешься, пока он не закончит свою работу
...
Рейтинг: 0 / 0
16.03.2021, 15:31
    #40054080
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Самоуничтожающийся объект
hlopotunкак лучше реализовать такой объект.

Код: sql
1.
2.
initialization
   TMyThread.Create(false).FreeOnTerminate := true;


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
16.03.2021, 15:34
    #40054086
hlopotun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Самоуничтожающийся объект
по завершению собственных действий.
...
Рейтинг: 0 / 0
16.03.2021, 15:36
    #40054087
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Самоуничтожающийся объект
TThread.CreateAnonymousThread();
...
Рейтинг: 0 / 0
16.03.2021, 15:59
    #40054107
Barmaley57
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Самоуничтожающийся объект
Dimitry Sibiryakov

hlopotunкак лучше реализовать такой объект.

Код: sql
1.
2.
initialization
   TMyThread.Create(false).FreeOnTerminate := true;


Опасно!
...
Рейтинг: 0 / 0
16.03.2021, 16:50
    #40054155
hlopotun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Самоуничтожающийся объект
Barmaley57
Dimitry Sibiryakov

.....
Опасно!

в случае завершения программы до завершения потока?
...
Рейтинг: 0 / 0
16.03.2021, 16:51
    #40054158
Barmaley57
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Самоуничтожающийся объект
память может утечь
...
Рейтинг: 0 / 0
16.03.2021, 16:55
    #40054163
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Самоуничтожающийся объект
16.03.2021 16:51, Barmaley57 пишет:
> память может утечь

завершившемуся процессу это фиолетово.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
16.03.2021, 17:23
    #40054192
hlopotun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Самоуничтожающийся объект
в этом проекте вообще следят за утечками (FastMM, ReportMemoryLeaksOnShutdown итп).
Кстати, FastMM распознает уничтожение такого обьекта?
...
Рейтинг: 0 / 0
16.03.2021, 17:27
    #40054201
Barmaley57
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Самоуничтожающийся объект
hlopotun
FastMM распознает уничтожение такого обьекта?
Конечно. Куда он денется!
...
Рейтинг: 0 / 0
16.03.2021, 18:53
    #40054265
hlopotun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Самоуничтожающийся объект
И сразу связанный вопрос.
По итогам работы thread в конце надо показать форму поверх приложения. Форму можно запустить асинхронно, сам процесс после этого можно завершить. Но форма должна быть кликабельной. По сути это форма с сообщением что есть новая версия программы, с кнопкой перехода по адресу в сети для скачивания новой версии и чекбоксом больше не показывать эту форму. А в треаде происходит проверка наличия новой версии программы в сети. Знаю что есть проблемы с vcl формами при их запуске из Thread но в этом случае форму нужно только асинхронно запустить а сам thread пусть закрывается.
thread в этом случае нужен только для того что бы в фоне выяскить наличие новой версии.
Я вот думаю, не будет ли лучшим решением в таком случае запустить невидимую mdi форму и если надо что то показать пусть она сама себя покажет, а если нет, сама себя завершит. Выглядит проще, и ненадо заморачиваться с thread итп И опять же не будет останавливать программу при старте во время проверки наличия новой версии по сети.
По сути задача сводится к фоновой проверке при старте программы наличия новой версии и если новая версия есть показать в конце форму.
Какой вариант на Ваш взгляд тут подходит больше? с thread или просто с mdi формой? или третий какой либо вариант?
Наверное выделю в новую тему .
...
Рейтинг: 0 / 0
16.03.2021, 19:04
    #40054269
s62
s62
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Самоуничтожающийся объект
hlopotun
...
По итогам работы thread в конце надо показать форму поверх приложения. Форму можно запустить асинхронно, сам процесс после этого можно завершить. Но форма должна быть кликабельной. По сути это форма с сообщением что есть новая версия программы, с кнопкой перехода по адресу в сети для скачивания новой версии и чекбоксом больше не показывать эту форму. А в треаде происходит проверка наличия новой версии программы в сети. Знаю что есть проблемы с vcl формами при их запуске из Thread но в этом случае форму нужно только асинхронно запустить а сам thread пусть закрывается.
...

Можете почитать про потоки вот это: https://www.sql.ru/forum/1327144/mnogopotochnoe-programmirovanie-v-delphi-dlya-nachinaushhih
А если коротко, то можете послать из потока главной форме сообщение через PostMessage, где сообщить, есть обновление или нет, а обработчик сообщения в главной форме уже может запустить форму "поверх приложения".
...
Рейтинг: 0 / 0
16.03.2021, 19:04
    #40054270
zedxxx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Самоуничтожающийся объект
hlopotun, Создаёте главную форму, запускаете из неё поток проверки новой версии, когда поток отработает, он должен прислать главной форме сообщение с результатом проверки и завершиться. Главная форма, получив сообщение, создаёт форму с предложением обновиться и показывает её юзеру.
...
Рейтинг: 0 / 0
16.03.2021, 19:43
    #40054281
LocksmithPC
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Самоуничтожающийся объект
Почему нельзя просто из только что запустившейся MyApp.exe запустить MyAppUpdater.exe?
...
Рейтинг: 0 / 0
16.03.2021, 21:48
    #40054326
ъъъъъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Самоуничтожающийся объект
zedxxx
hlopotun, Создаёте главную форму, запускаете из неё поток проверки новой версии, когда поток отработает, он должен прислать главной форме сообщение с результатом проверки и завершиться. Главная форма, получив сообщение, создаёт форму с предложением обновиться и показывает её юзеру.

Основное Приложение при запуске просто запускаем приложение Обновлятор, и работает дальше. Обновлятор проверяет, есть ли обновления, если есть - скачивает их во Временное Хранилище. По завершении скачивания, переносит обновления из Временного Хранилища в папку Загрузки и завершает свою работу.
Основное приложение, при следующем запуске, обнаружив, что папку Загрузки не пуста, выполняет действия по обновлению, удаляет содержимое папки Загрузки, запускает Обновлятор и работает дальше.
...таким образом, обновления скачиваться даже тогда, когда Основное Приложение завершило работу. Более того, запуск Обновлятора можно делать по расписанию или при запуске ОС.
Нафига вам эти треды.
...
Рейтинг: 0 / 0
17.03.2021, 09:15
    #40054425
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Самоуничтожающийся объект
zedxxx
Создаёте главную форму, запускаете из неё поток

Потоку не нужна главная форма. Точнее вообще формы ему не нужны. При этом форма может долго создаваться. Проще запустить поток до создания каких-либо форм.
Поток после себя оставит либо сообщение в очереди формы, либо переменную с результатом.
...
Рейтинг: 0 / 0
17.03.2021, 09:57
    #40054447
Fr0sT-Brutal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Самоуничтожающийся объект
ъъъъъ

Основное Приложение при запуске просто запускаем приложение Обновлятор, и работает дальше. Обновлятор проверяет, есть ли обновления, если есть - скачивает их во Временное Хранилище. По завершении скачивания, переносит обновления из Временного Хранилища в папку Загрузки и завершает свою работу.
Основное приложение, при следующем запуске, обнаружив, что папку Загрузки не пуста, выполняет действия по обновлению, удаляет содержимое папки Загрузки, запускает Обновлятор и работает дальше.
...таким образом, обновления скачиваться даже тогда, когда Основное Приложение завершило работу. Более того, запуск Обновлятора можно делать по расписанию или при запуске ОС.
Нафига вам эти треды.

А при должной сноровке Обновлятор и Основное приложение может быть один и тот же экзешник
...
Рейтинг: 0 / 0
17.03.2021, 10:49
    #40054463
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Самоуничтожающийся объект
zedxxx,
в .dpr до создания всех форм можно делать сделать что угодно. и конечно же всё будет работать. и потоков создать и проверить/перезапуститься и т.п
...
Рейтинг: 0 / 0
18.03.2021, 01:22
    #40054756
ъъъъъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Самоуничтожающийся объект
Fr0sT-Brutal
А при должной сноровке Обновлятор и Основное приложение может быть один и тот же экзешник

Можно, конечно, но, ИМХО, сие подобно стремлению во что бы то ни стало избавляться от dll's.
...
Рейтинг: 0 / 0
18.03.2021, 09:08
    #40054791
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Самоуничтожающийся объект
hlopotun,

обычный поток создаёшь

Код: pascal
1.
2.
initialization
  MyThread := TMyThread.Create();



в конце Execute
Код: pascal
1.
2.
3.
  Tmp := InterlockedExchangePtr(Pointer(MyThread), nil);
  if (Tmp <> nil) then
    Tmp.FreeOnTerminate := True;



в финализации модуля

Код: pascal
1.
2.
finalization
  TObject(InterlockedExchangePtr(Pointer(MyThread), nil)).Free;
...
Рейтинг: 0 / 0
26.04.2021, 17:42
    #40066070
hlopotun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Самоуничтожающийся объект
Dimitry Sibiryakov

hlopotunкак лучше реализовать такой объект.

Код: sql
1.
2.
initialization
   TMyThread.Create(false).FreeOnTerminate := true;




если подобным образом запустить thread и пользователь был достаточно быстр и сразу закрыл приложение после запуска а процесс ещё не завершился вываливается исключение. Есть ли возможность в таком процессе отработать закрытие формы (например не дать её закрыть, или прибить сам процесс не вызывая исключение)?

Спасибо.
...
Рейтинг: 0 / 0
26.04.2021, 17:53
    #40066074
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Самоуничтожающийся объект
похоже, тут программист нужен... (С)
...
Рейтинг: 0 / 0
26.04.2021, 22:37
    #40066142
DmSer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Самоуничтожающийся объект
Dimitry Sibiryakov

hlopotunкак лучше реализовать такой объект.

Код: sql
1.
2.
initialization
   TMyThread.Create(false).FreeOnTerminate := true;




По собственному опыту могу сказать, что так делать не нужно. В наших программах было несколько мест, где старт потоков выполнялся в секции initialization. Иногда (один раз из 100) при запуске программ возникали различные странные ошибки, зачастую процесс тут же вырубался. Долго разбирались. Оказалось, что виновник - это создание потока в секции initialization EXE-файла (про DLL даже и не говорю). После переноса в другие места (например, в OnFormCreate), программа запускается в 100% случаев.
Гоняли с помощью такого батника:
Код: powershell
1.
2.
3.
4.
for /l %%i in (1,1,1000) do (
echo %%i
C:\AppPath\App.exe /CloseAfterStart
)


В DPR-файле Exit делали сразу после BEGIN. Перед Exit писали сообщение в лог.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Самоуничтожающийся объект / 25 сообщений из 29, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]