|
|
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
Vizit0r, StealthForm почему не использовать например TObjectList<> с OwnerData для хранения списков потоков? поток должен проверять Terminated при своей работе и выходить в случае его установки - его устанавливает вызов Terminate из деструктора что ИМХО неправильно _Vasilisk_ , некультурно использовать системное апи в таких примитивных вещах ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2017, 21:59:34 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)некультурно использовать системное апи в таких примитивных вещахГораздо культурнее городить десяток классов-обвязок ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2017, 22:40:18 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_kealon(Ruslan)некультурно использовать системное апи в таких примитивных вещахГораздо культурнее городить десяток классов-обвязок не думаю что у ТС тот случай, когда обвязки приходится использовать согласен, что архитектурно там нашкодили прилично, но в целом на простых вещах довольно юзабельно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2017, 23:59:54 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
ТС в итоге решил не усложнять себе жизнь. Вырубил\переделал все, что при завершении могло что-то слать или запрашивать у главного потока. В итоге теперь хватает простого Код: pascal 1. потратил время, но так намного лучше, чем извращения с зацикливаниями thread <-> main thread ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2017, 14:12:53 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
Vizit0rТС в итоге решил не усложнять себе жизнь. Вырубил\переделал все, что при завершении могло что-то слать или запрашивать у главного потока. В итоге теперь хватает простого Код: pascal 1. потратил время, но так намного лучше, чем извращения с зацикливаниями thread <-> main thread Я знаю толк в извращениях, но чем помешала стандартная защита от дедлока, непонятно почему не использовать стандартный деструктор потока вместо API, тоже непонятно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2017, 14:52:27 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)потратил время, но так намного лучше, чем извращения с зацикливаниями thread <-> main thread Я знаю толк в извращениях, но чем помешала стандартная защита от дедлока, непонятно почему не использовать стандартный деструктор потока вместо API, тоже непонятно 1) тем, что лучше предотвратить возможность дедлока, чем бороться с последствиями. Это, впрочем, не только дедлока касается. 2) тем, что мы с тобой говорим о разных вещах видимо. У меня: - поток с FreeOnTerminate = False; - в Stop_MainThread я даю ему сигнал закончить все работы и завершить метод Execute - дальше TThread делает EndThread потоку, и срабатывает моё WaitForSingleObject(Handle, 10000) - если Stop_MainThread возвращает True - то значит поток успешно завершился, можно освобождать его (и все, что в нем). Если False - значит поток еще чего-то там доделывает, освободить его в этот момент - это гарантированно получить вагон ошибок. Пропускаем, идем к следующему. а что ты понимаешь под "использовать стандартный деструктор" - я так и не понял :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2017, 15:43:29 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
там вообще в принципе все без бубнов призвано работать можно даже вообще без апи и WaitForMultipleObjects... достаточно например при завершении в OnTerminate доложить, что завершен, в главный поток. и когда все потоки закончили работу, продолжить выход из программы никаких проблем никогда не возникало с этим подходом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2017, 16:23:33 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
Vizit0rПропускаем, идем к следующему.Почему бы все это не сделать так Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Все в псевдокоде, но думаю, что идея ясна. Тогда не нужно никого ждать и опрашивать. Кто первый завершился того и убиваем ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2017, 16:25:06 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
krapotkinи когда все потоки закончили работу, продолжить выход из программыЕсли вызов деструктора потока (объекта класса TThread) - тяжелая операция, то имеет смысл его вызывать по мере завершения потоков Сам, всегда использую FreeOnTerminate + событие с ручным сбросом, чтобы уведомить все потоки сразу о завершении + инверсный семафор, чтобы знать когда все закончилось ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2017, 16:29:42 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
Vizit0r, идем к следующему , а можно и сразу пачкой WaitForMultipleObjects, и да, пропускаем , если дальше ExitProcess. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2017, 16:34:43 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_Vizit0rПропускаем, идем к следующему.Почему бы все это не сделать так Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Все в псевдокоде, но думаю, что идея ясна. Тогда не нужно никого ждать и опрашивать. Кто первый завершился того и убиваем _Vasilisk_Почему бы все это не сделать так несколько причин навскидку 1) не было уверенности в гарантированной окончании работы потока в разумные сроки. Но сейчас я вроде по всем таким "тяжелым" местам прошелся. 2) NextGen не умеет в WaitForMultipleObjects. но так побыстрее должно прибиваться все это хозяйство. Всуну его наверное с IFDEF под винду. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2017, 16:41:45 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
Vizit0rне было уверенности в гарантированной окончании работы потока в разумные срокиЭто ахтунг! Но костыль можно предложить такой Код: pascal 1. 2. 3. 4. 5. 6. 7. Vizit0r2) NextGen не умеет в WaitForMultipleObjects.Это аргумент. Нужно посмотреть, может там есть что-то подобное ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2017, 17:02:07 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
Vizit0rв приложении есть треды (один, два, десять, хоть сто). Пытаюсь их корректно останавливать. В закрытии главного окна делаю Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. Проблема тут - 10с проходит, WAIT_TIMEOUT не срабатывает. Не срабатывает он и потом. В отладке же чудеса - если кидаю бряк на выход из процедуры - срабатывает таймаут нормально. Но чудес же не бывает. Я что-то делаю не так? Связывать выполнение/завершение отдельных потоков с частной формой (особенно с элементами типа List) - плохая идея. Не делай так. - если Stop_MainThread возвращает True - то значит поток успешно завершился, можно освобождать его (и все, что в нем). Если False - значит поток еще чего-то там доделывает, освободить его в этот момент - это гарантированно получить вагон ошибок. Пропускаем, идем к следующему. У меня рабочий день закончен. Мне как-то на твои потоки и их завершение совершенно насрать. Как и на твои ошибки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2017, 18:10:57 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_Bred eFeMкогда поток сам делает своему хэндлу CloseHandle() то это, наверное, не очень правильно ?Почему? Что в этом не правильного? Есть класс TThread, который инкапсулирует работу с потоком. Этот класс в своем конструкторе создает поток и получает его хэндл. Будет вполне логично этот хэндл закрыть, когда у класса отпадет в нем необходимость. Что он и делает. Закрыти хэндла на работоспособность потока никак не влияет Потому что когда хэнд закрыт, он закрыт. На работоспособность потока это никак не влияет. Но вот на возможность управления потоком через скопированный (не дублированный) хэнд это влияет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2017, 18:24:09 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
Завернул убивание ссылки на OnTerminate, гоняю под нагрузками - все быстро закрывается. ЧИТД. Всем спасибо. BasiliskУ меня рабочий день закончен. Мне как-то на твои потоки и их завершение совершенно насрать. Как и на твои ошибки. Ты пришел сюда специально, чтобы написать что тебе насрать на этот топик и мои проблемы? Л - логика. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2017, 18:28:22 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
BasiliskУ меня рабочий день закончен. Мне как-то на твои потоки и их завершение совершенно насрать. Как и на твои ошибки. В этот моменте вынужденно поясню. Человек, который пользуется программой, он не в курсе, что нужно ждать чего-то. Ему проще компьютер выключить кнопкой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2017, 18:29:36 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
Vizit0rмои проблемы? Твои проблемы это вот такой код Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2017, 18:46:59 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
тю блин. Тогда понятно. Обычно дожидаются - это домашние (игровые) компы, там вобщем-то спешить некуда. 5-10 секунд это не критично. Впрочем, сейчас побыстрее будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2017, 18:47:56 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
Vizit0rkealon(Ruslan)потратил время, но так намного лучше, чем извращения с зацикливаниями thread <-> main thread Я знаю толк в извращениях, но чем помешала стандартная защита от дедлока, непонятно почему не использовать стандартный деструктор потока вместо API, тоже непонятно 1) тем, что лучше предотвратить возможность дедлока, чем бороться с последствиями. Это, впрочем, не только дедлока касается. 2) тем, что мы с тобой говорим о разных вещах видимо. У меня: - поток с FreeOnTerminate = False; - в Stop_MainThread я даю ему сигнал закончить все работы и завершить метод Execute - дальше TThread делает EndThread потоку, и срабатывает моё WaitForSingleObject(Handle, 10000) - если Stop_MainThread возвращает True - то значит поток успешно завершился, можно освобождать его (и все, что в нем). Если False - значит поток еще чего-то там доделывает, освободить его в этот момент - это гарантированно получить вагон ошибок. Пропускаем, идем к следующему. а что ты понимаешь под "использовать стандартный деструктор" - я так и не понял :) может с поток с FreeOnTerminate = True;? тогда бы ещё были понятны такие извраты, но даже в этом случае достаточно в OnTerminate убить ссылку на объект потока стандартный деструктор потока вызывает Terminate и ждёт его завершения - нормальный код потока проверяет Terminated и завершается при установке этого флага, вот и непонятно с чего все эти танцы с бубнами ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2017, 18:56:36 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
так уже. при использовании уведомления OnTerminate уже нет смысла в лишних движениях для освобождения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2017, 18:59:51 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
Vizit0rпри использовании уведомления OnTerminate уже нет смысла в лишних движениях для освобождения по моим наблюдениям, если у потока FreeOnTerminate = True, то при умирании потока "естественной смертью" ссылка на экземпляр потока не об- nil -яется. Попробуй сделать глобальную переменную и перед новым запуском потока проверить ее наличие Код: pascal 1. Если освобождать память вручную через FreeAndNil ( + FreeOnTerminate = False), то память освобождается корректно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2017, 00:40:08 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
Как этоДокссылка на экземпляр потока не об- nil -яется.связано с этимДокFreeOnTerminate = False), то память освобождается корректно.? Корректное освобождение памяти - это вызов деструктора. Точка. Кто и когда будет его вызывать - абсолютно фиолетово. При вызове деструктора ссылка обнуляться не должна. Хотя бы потому, что этих ссылок может быть миллион. Но если тебе важно обнуление конкретной ссылки. то да - обнулять ее придется руками ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2017, 02:12:36 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
конечно не обнуляется сам по себе указатель, с чего бы ему обнуляться. Всё учтено. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2017, 05:56:49 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_Корректное освобождение памяти - это вызов деструктора. Точка. Кто и когда будет его вызывать - абсолютно фиолетово. корректно - это когда каждый раз, как в первый раз. Нет? :) Вот вы тут про хэндлы и другие умные слова. А практическая польза от всего этого словесного потока? Тогда уж в начале трэда уточняйте что ли, что значит корректно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2017, 10:38:18 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39478586&tid=2042091]: |
0ms |
get settings: |
6ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
60ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
66ms |
get tp. blocked users: |
1ms |
| others: | 221ms |
| total: | 389ms |

| 0 / 0 |
