powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Надо прервать по таймауту выполнение процедуры в основном потоке.
19 сообщений из 19, страница 1 из 1
Надо прервать по таймауту выполнение процедуры в основном потоке.
    #39902558
Страдалецъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот такая простенькая вроде задача,имеем такой код:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
procedure DoProcess;
begin
 while True do Sleep(5);
end;

begin
 DoProcess;
end.


Условия такие: DoProcess нельзя модифицировать и засунуть в поток, но необходимо каким-то образом прервать ее выполнение по истечении скажем 30 секунд.
...
Рейтинг: 0 / 0
Надо прервать по таймауту выполнение процедуры в основном потоке.
    #39902562
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Страдалецъ
DoProcess нельзя модифицировать и засунуть в поток, но необходимо каким-то образом прервать ее выполнение по истечении скажем 30 секунд.

Тогда в процесс.
...
Рейтинг: 0 / 0
Надо прервать по таймауту выполнение процедуры в основном потоке.
    #39903033
x1ca4064
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Страдалецъ

Условия такие: DoProcess нельзя модифицировать и засунуть в поток, но необходимо каким-то образом прервать ее выполнение по истечении скажем 30 секунд.


Создать новый поток, которому передать хендл (H) основного. Новый поток должен подождать требуемое время, потом:
SuspendThread(H)
ctx.ContextFlags:=CONTEXT_CONTROL
GetThreadContext(H,ctx)
ctx.EIP:=DWORD(@RaiseException)
SetThreadContext(H,ctx)
ResumeThread(H)

RaiseException - процедура, которая вызывает какое-то исключение
...
Рейтинг: 0 / 0
Надо прервать по таймауту выполнение процедуры в основном потоке.
    #39903555
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
x1ca4064
GetThreadContext(H,ctx)
ctx.EIP:=DWORD(@RaiseException)
SetThreadContext(H,ctx)
Зверь!

Только можно нарваться. Когда в потоке идет последовательный вызов функций, неподразумевающих выброс исключений. Любой пример из MSDN
...
Рейтинг: 0 / 0
Надо прервать по таймауту выполнение процедуры в основном потоке.
    #39903984
x1ca4064
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Зверь!

Только можно нарваться.


Отчаянные задачи требуют отчаянных решений :) В этом способе много хитроспрятанных камней!
...
Рейтинг: 0 / 0
Надо прервать по таймауту выполнение процедуры в основном потоке.
    #39904029
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
x1ca4064
Страдалецъ

Условия такие: DoProcess нельзя модифицировать и засунуть в поток, но необходимо каким-то образом прервать ее выполнение по истечении скажем 30 секунд.


Создать новый поток, которому передать хендл (H) основного. Новый поток должен подождать требуемое время, потом:
SuspendThread(H)
ctx.ContextFlags:=CONTEXT_CONTROL
GetThreadContext(H,ctx)
ctx.EIP:=DWORD(@RaiseException)
SetThreadContext(H,ctx)
ResumeThread(H)

RaiseException - процедура, которая вызывает какое-то исключение


Так двигать указатель инструкций чревато получением UB.
...
Рейтинг: 0 / 0
Надо прервать по таймауту выполнение процедуры в основном потоке.
    #39904064
x1ca4064
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Квейд

Так двигать указатель инструкций чревато получением UB.


А можете привести пример?
...
Рейтинг: 0 / 0
Надо прервать по таймауту выполнение процедуры в основном потоке.
    #39904098
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
x1ca4064
Квейд

Так двигать указатель инструкций чревато получением UB.


А можете привести пример?
Исхожу из того, что SuspendThread может приостановить поток между двумя произвольными инструкциями, бросание исключений между которыми может нарушить состояние (state) потока.
...
Рейтинг: 0 / 0
Надо прервать по таймауту выполнение процедуры в основном потоке.
    #39904356
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Квейд
Исхожу из того, что SuspendThread может приостановить поток между двумя произвольными инструкциями, бросание исключений между которыми может нарушить состояние (state) потока.
ну мы её собственно для этого и применяем
Я бы больше переживал как выход из режима ядра будет работать, и связки API и "в API". Утечки памяти однозначно как нефиг делать получить
...
Рейтинг: 0 / 0
Надо прервать по таймауту выполнение процедуры в основном потоке.
    #39904432
x1ca4064
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)

Я бы больше переживал как выход из режима ядра будет работать, и связки API и "в API". Утечки памяти однозначно как нефиг делать получить


SuspendThread останавливает поток в пользовательском режиме. Утечки памяти сильно зависят от реализации DoProcess и всего что она вызывает (блоки finally должны отработать).
...
Рейтинг: 0 / 0
Надо прервать по таймауту выполнение процедуры в основном потоке.
    #39904492
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
x1ca4064
SuspendThread останавливает поток в пользовательском режиме. Утечки памяти сильно зависят от реализации DoProcess и всего что она вызывает (блоки finally должны отработать).
вот этого не знал
с обработкой исключений согласен, должно работать - если код их глушить не будет.
код выходит хотя бы приблизительно знать надо и он должен быть "очень правильным", что бы не было утечек
...
Рейтинг: 0 / 0
Надо прервать по таймауту выполнение процедуры в основном потоке.
    #39905217
x1ca4064
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)
код выходит хотя бы приблизительно знать надо и он должен быть "очень правильным", что бы не было утечек


Тут на задач на несколько топиков: как освободить память, которую не освободила прерванная процедура, так же и с другими ресурсами, думаю, каждая из них решаема в более-менее общем виде, за исключением изменения внешних по отношению к программе объектов, но эти объекты, обычно, готовы к подобному.
...
Рейтинг: 0 / 0
Надо прервать по таймауту выполнение процедуры в основном потоке.
    #39905625
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Простой "правильный код"
Код: pascal
1.
2.
3.
4.
5.
6.
7.
F := CreateFile(....);
Win32Check(F <> INVALID_HANDLE);
try
  .......
finally
  CloseHandle(F);
end;

поднятие исключения после CreateFile, но до try приводит к блокировке файла до закрытия всей программы
...
Рейтинг: 0 / 0
Надо прервать по таймауту выполнение процедуры в основном потоке.
    #39905637
x1ca4064
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
поднятие исключения после CreateFile, но до try приводит к блокировке файла до закрытия всей программы


Совершенно верно, для избежания подобного можно перехватывать CreateFile (и прочие Create/Open), CloseXXXX потом смотреть, что осталось не закрытым - в общем случае много "приседаний" нужно.
...
Рейтинг: 0 / 0
Надо прервать по таймауту выполнение процедуры в основном потоке.
    #39905691
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В .net у Thread есть метод Abort()
Можно посмотреть как они реализовали его, вряд ли ли майкрософт сделает какаху...
Покопаться можно тут:
https://github.com/microsoft/referencesource/blob/master/mscorlib/system/threading/thread.cs
...
Рейтинг: 0 / 0
Надо прервать по таймауту выполнение процедуры в основном потоке.
    #39905710
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite
В .net у Thread есть метод Abort()
А в Win32 TerminateThread. А еще в .Net есть сборщик мусора
...
Рейтинг: 0 / 0
Надо прервать по таймауту выполнение процедуры в основном потоке.
    #39906318
Страдалецъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_F := CreateFile(....);
Win32Check(F <> INVALID_HANDLE);
try
.......
finally
CloseHandle(F);
end;
Не догнал, а какое отношение сей код имеет к исходной задаче? Каким образом он поможет прервать выполнение процедуры?
...
Рейтинг: 0 / 0
Надо прервать по таймауту выполнение процедуры в основном потоке.
    #39906359
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Страдалецъ,
типа сам следи
...
Рейтинг: 0 / 0
Надо прервать по таймауту выполнение процедуры в основном потоке.
    #39906385
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Страдалецъ
Каким образом он поможет прервать выполнение процедуры?
Никаким. Это был пример почему нельзя в произвольный момент суспендить поток и поднимать снаружи исключение
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Надо прервать по таймауту выполнение процедуры в основном потоке.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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