|
|
|
Надо прервать по таймауту выполнение процедуры в основном потоке.
|
|||
|---|---|---|---|
|
#18+
Вот такая простенькая вроде задача,имеем такой код: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. Условия такие: DoProcess нельзя модифицировать и засунуть в поток, но необходимо каким-то образом прервать ее выполнение по истечении скажем 30 секунд. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2019, 14:47 |
|
||
|
Надо прервать по таймауту выполнение процедуры в основном потоке.
|
|||
|---|---|---|---|
|
#18+
Страдалецъ DoProcess нельзя модифицировать и засунуть в поток, но необходимо каким-то образом прервать ее выполнение по истечении скажем 30 секунд. Тогда в процесс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2019, 14:53 |
|
||
|
Надо прервать по таймауту выполнение процедуры в основном потоке.
|
|||
|---|---|---|---|
|
#18+
Страдалецъ Условия такие: DoProcess нельзя модифицировать и засунуть в поток, но необходимо каким-то образом прервать ее выполнение по истечении скажем 30 секунд. Создать новый поток, которому передать хендл (H) основного. Новый поток должен подождать требуемое время, потом: SuspendThread(H) ctx.ContextFlags:=CONTEXT_CONTROL GetThreadContext(H,ctx) ctx.EIP:=DWORD(@RaiseException) SetThreadContext(H,ctx) ResumeThread(H) RaiseException - процедура, которая вызывает какое-то исключение ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2019, 15:31 |
|
||
|
Надо прервать по таймауту выполнение процедуры в основном потоке.
|
|||
|---|---|---|---|
|
#18+
x1ca4064 GetThreadContext(H,ctx) ctx.EIP:=DWORD(@RaiseException) SetThreadContext(H,ctx) Только можно нарваться. Когда в потоке идет последовательный вызов функций, неподразумевающих выброс исключений. Любой пример из MSDN ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2019, 15:49 |
|
||
|
Надо прервать по таймауту выполнение процедуры в основном потоке.
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_ Зверь! Только можно нарваться. Отчаянные задачи требуют отчаянных решений :) В этом способе много хитроспрятанных камней! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2019, 12:13 |
|
||
|
Надо прервать по таймауту выполнение процедуры в основном потоке.
|
|||
|---|---|---|---|
|
#18+
x1ca4064 Страдалецъ Условия такие: DoProcess нельзя модифицировать и засунуть в поток, но необходимо каким-то образом прервать ее выполнение по истечении скажем 30 секунд. Создать новый поток, которому передать хендл (H) основного. Новый поток должен подождать требуемое время, потом: SuspendThread(H) ctx.ContextFlags:=CONTEXT_CONTROL GetThreadContext(H,ctx) ctx.EIP:=DWORD(@RaiseException) SetThreadContext(H,ctx) ResumeThread(H) RaiseException - процедура, которая вызывает какое-то исключение Так двигать указатель инструкций чревато получением UB. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2019, 12:50 |
|
||
|
Надо прервать по таймауту выполнение процедуры в основном потоке.
|
|||
|---|---|---|---|
|
#18+
Квейд Так двигать указатель инструкций чревато получением UB. А можете привести пример? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2019, 13:24 |
|
||
|
Надо прервать по таймауту выполнение процедуры в основном потоке.
|
|||
|---|---|---|---|
|
#18+
x1ca4064 Квейд Так двигать указатель инструкций чревато получением UB. А можете привести пример? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2019, 14:13 |
|
||
|
Надо прервать по таймауту выполнение процедуры в основном потоке.
|
|||
|---|---|---|---|
|
#18+
Квейд Исхожу из того, что SuspendThread может приостановить поток между двумя произвольными инструкциями, бросание исключений между которыми может нарушить состояние (state) потока. Я бы больше переживал как выход из режима ядра будет работать, и связки API и "в API". Утечки памяти однозначно как нефиг делать получить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2019, 20:16 |
|
||
|
Надо прервать по таймауту выполнение процедуры в основном потоке.
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan) Я бы больше переживал как выход из режима ядра будет работать, и связки API и "в API". Утечки памяти однозначно как нефиг делать получить SuspendThread останавливает поток в пользовательском режиме. Утечки памяти сильно зависят от реализации DoProcess и всего что она вызывает (блоки finally должны отработать). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2019, 05:17 |
|
||
|
Надо прервать по таймауту выполнение процедуры в основном потоке.
|
|||
|---|---|---|---|
|
#18+
x1ca4064 SuspendThread останавливает поток в пользовательском режиме. Утечки памяти сильно зависят от реализации DoProcess и всего что она вызывает (блоки finally должны отработать). с обработкой исключений согласен, должно работать - если код их глушить не будет. код выходит хотя бы приблизительно знать надо и он должен быть "очень правильным", что бы не было утечек ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2019, 09:49 |
|
||
|
Надо прервать по таймауту выполнение процедуры в основном потоке.
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan) код выходит хотя бы приблизительно знать надо и он должен быть "очень правильным", что бы не было утечек Тут на задач на несколько топиков: как освободить память, которую не освободила прерванная процедура, так же и с другими ресурсами, думаю, каждая из них решаема в более-менее общем виде, за исключением изменения внешних по отношению к программе объектов, но эти объекты, обычно, готовы к подобному. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2019, 07:08 |
|
||
|
Надо прервать по таймауту выполнение процедуры в основном потоке.
|
|||
|---|---|---|---|
|
#18+
Простой "правильный код" Код: pascal 1. 2. 3. 4. 5. 6. 7. поднятие исключения после CreateFile, но до try приводит к блокировке файла до закрытия всей программы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2019, 15:26 |
|
||
|
Надо прервать по таймауту выполнение процедуры в основном потоке.
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_ поднятие исключения после CreateFile, но до try приводит к блокировке файла до закрытия всей программы Совершенно верно, для избежания подобного можно перехватывать CreateFile (и прочие Create/Open), CloseXXXX потом смотреть, что осталось не закрытым - в общем случае много "приседаний" нужно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2019, 15:41 |
|
||
|
Надо прервать по таймауту выполнение процедуры в основном потоке.
|
|||
|---|---|---|---|
|
#18+
В .net у Thread есть метод Abort() Можно посмотреть как они реализовали его, вряд ли ли майкрософт сделает какаху... Покопаться можно тут: https://github.com/microsoft/referencesource/blob/master/mscorlib/system/threading/thread.cs ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2019, 16:28 |
|
||
|
Надо прервать по таймауту выполнение процедуры в основном потоке.
|
|||
|---|---|---|---|
|
#18+
X-Cite В .net у Thread есть метод Abort() ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2019, 16:42 |
|
||
|
Надо прервать по таймауту выполнение процедуры в основном потоке.
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_F := CreateFile(....); Win32Check(F <> INVALID_HANDLE); try ....... finally CloseHandle(F); end; Не догнал, а какое отношение сей код имеет к исходной задаче? Каким образом он поможет прервать выполнение процедуры? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2019, 18:22 |
|
||
|
Надо прервать по таймауту выполнение процедуры в основном потоке.
|
|||
|---|---|---|---|
|
#18+
Страдалецъ, типа сам следи ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2019, 19:49 |
|
||
|
Надо прервать по таймауту выполнение процедуры в основном потоке.
|
|||
|---|---|---|---|
|
#18+
Страдалецъ Каким образом он поможет прервать выполнение процедуры? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2019, 21:12 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39902562&tid=2038747]: |
0ms |
get settings: |
4ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
139ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
40ms |
get tp. blocked users: |
1ms |
| others: | 214ms |
| total: | 421ms |

| 0 / 0 |
