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

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

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

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

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


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

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

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


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

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

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

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

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

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

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

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

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

Можно, конечно, но, ИМХО, сие подобно стремлению во что бы то ни стало избавляться от dll's.
...
Рейтинг: 0 / 0
Самоуничтожающийся объект
    #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
Самоуничтожающийся объект
    #40066070
hlopotun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov

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

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




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

Спасибо.
...
Рейтинг: 0 / 0
Самоуничтожающийся объект
    #40066074
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
похоже, тут программист нужен... (С)
...
Рейтинг: 0 / 0
Самоуничтожающийся объект
    #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
25 сообщений из 29, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Самоуничтожающийся объект
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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