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

start [/forum/topic.php?fid=58&mobile=1&tid=2038747]: |
0ms |
get settings: |
8ms |
get forum list: |
10ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
143ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
54ms |
get tp. blocked users: |
2ms |
| others: | 215ms |
| total: | 449ms |

| 0 / 0 |
