Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Надо прервать по таймауту выполнение процедуры в основном потоке. / 19 сообщений из 19, страница 1 из 1
13.12.2019, 14:47
    #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
13.12.2019, 14:53
    #39902562
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Надо прервать по таймауту выполнение процедуры в основном потоке.
Страдалецъ
DoProcess нельзя модифицировать и засунуть в поток, но необходимо каким-то образом прервать ее выполнение по истечении скажем 30 секунд.

Тогда в процесс.
...
Рейтинг: 0 / 0
14.12.2019, 15:31
    #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
16.12.2019, 15:49
    #39903555
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Надо прервать по таймауту выполнение процедуры в основном потоке.
x1ca4064
GetThreadContext(H,ctx)
ctx.EIP:=DWORD(@RaiseException)
SetThreadContext(H,ctx)
Зверь!

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

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


Отчаянные задачи требуют отчаянных решений :) В этом способе много хитроспрятанных камней!
...
Рейтинг: 0 / 0
17.12.2019, 12:50
    #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
17.12.2019, 13:24
    #39904064
x1ca4064
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Надо прервать по таймауту выполнение процедуры в основном потоке.
Квейд

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


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

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


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

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


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


Тут на задач на несколько топиков: как освободить память, которую не освободила прерванная процедура, так же и с другими ресурсами, думаю, каждая из них решаема в более-менее общем виде, за исключением изменения внешних по отношению к программе объектов, но эти объекты, обычно, готовы к подобному.
...
Рейтинг: 0 / 0
19.12.2019, 15:26
    #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
19.12.2019, 15:41
    #39905637
x1ca4064
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Надо прервать по таймауту выполнение процедуры в основном потоке.
_Vasilisk_
поднятие исключения после CreateFile, но до try приводит к блокировке файла до закрытия всей программы


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


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