|
|
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
в приложении есть треды (один, два, десять, хоть сто). Пытаюсь их корректно останавливать. В закрытии главного окна делаю Код: 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 не срабатывает. Не срабатывает он и потом. В отладке же чудеса - если кидаю бряк на выход из процедуры - срабатывает таймаут нормально. Но чудес же не бывает. Я что-то делаю не так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2017, 17:13:34 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
to get extended information call GetLastError ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2017, 17:28:39 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
error нет. есть MsgWaitForMultipleObjects, который крутится себе в вечном цикле, сообщения оконные обрабатывает, все такое - но выходить не выходит, ни по таймауту, ни с ошибкой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2017, 17:45:33 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
Vizit0r, На АОПе еще кто-то играет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2017, 17:46:10 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
КвейдVizit0r, На АОПе еще кто-то играет? ты задаешь этот вопрос уже второй или третий раз. Я не в курсе, я не играю ни там, ни вообще на каком-то шарде. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2017, 17:54:40 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
А если сделать так? Код: pascal 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2017, 19:04:30 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
Vizit0rWAIT_TIMEOUT не срабатываеЗначит срабатывает, что-то другое. Например, WAIT_FAILED, что приводит к бесконечному циклу. А сам WAIT_FAILED возникает из-за того, что был вызван деструктор потока, который закрыл хэндл, и Вы ломитесь по невалидному хендлу. Чтобы такого не происходило, нужн 1) Заблаговременно вызывать DuplicateHandle 2) Предусматривать ВСЕ возможные возвращаемые значения Vizit0rВ отладке же чудеса - если кидаю бряк на выход из процедуры - срабатывает таймаут нормальноПотому что меняется тайминг и поток не успевает вызвать деструктор ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2017, 19:05:24 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
ну деструктор не вызывается, потому что FreeOnTerminate = False, но ход мыслей я понял. Кстати, а DuplicateHandle зачем? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2017, 16:03:14 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
Vizit0rКстати, а DuplicateHandle зачем?Чтобы, когда поток сделает своему хэндлу CloseHandle() у тебя осталась валидная копия ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2017, 16:08:46 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
интересно. Не знал, спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2017, 16:31:02 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, когда поток сам делает своему хэндлу CloseHandle() то это, наверное, не очень правильно ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2017, 17:02:55 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
Bred eFeMкогда поток сам делает своему хэндлу CloseHandle() то это, наверное, не очень правильно ?Почему? Что в этом не правильного? Есть класс TThread, который инкапсулирует работу с потоком. Этот класс в своем конструкторе создает поток и получает его хэндл. Будет вполне логично этот хэндл закрыть, когда у класса отпадет в нем необходимость. Что он и делает. Закрыти хэндла на работоспособность потока никак не влияет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2017, 22:12:07 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
Vizit0rинтересно. Не знал, спасибо.Только не забудь сам вызвать CloseHandle() для полученной копии ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2017, 22:13:40 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_Только не забудь сам вызвать CloseHandle() для полученной копиивот-вот, а по сути, конструктор то у тебя вне потока получает этот Handle, значит, архитектурно правильно, его и закрыть вне потока. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2017, 01:07:17 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_Vizit0rинтересно. Не знал, спасибо.Только не забудь сам вызвать CloseHandle() для полученной копии ну это само собой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2017, 08:50:18 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
Bred eFeMвот-вот, а по сути, конструктор то у тебя вне потока получает этот Handle, значит, архитектурно правильно, его и закрыть вне потока.Хэндл получается в конструкторе класса, закрывается в деструкторе класса. Что не так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2017, 22:07:49 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_ Что не так?DuplicateHandle зачем? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2017, 01:54:42 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
Bred eFeM, _Vasilisk_Vizit0rКстати, а DuplicateHandle зачем?Чтобы, когда поток ( читать - объект класса TThread ) сделает своему хэндлу CloseHandle() у тебя осталась валидная копия ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2017, 21:21:45 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_когда поток (читать - объект класса TThread) сделает своему хэндлу CloseHandle() конструктор то у тебя вне потока получает этот Handle, значит, архитектурно правильно, его и закрыть вне потока Ситуация, когда в рамках одного процесса действительно нужна копия хэндла, мне непонятна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2017, 00:14:30 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
Bred eFeMконструктор то у тебя вне потока получает этот Handle, значит, архитектурно правильно, его и закрыть вне потока Опять по новому кругу. Ну открой ты исходники и посмотри TThread.Create, TThread.Destroy Bred eFeMСитуация, когда в рамках одного процесса действительно нужна копия хэндла, мне непонятна.Хендлом владеет экземпляр класса TThread. Он его порождает, он же его и убивает. Если хэндл используется где-то вне этого объекта и существует вероятность обращения к этому хэндлу после уничтожения объекта, то нужно делать копию ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2017, 14:54:39 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, как это хэндл используется где-то вне этого объекта после класс TThread, который инкапсулирует работу с потоком. Ладно, CloseThread(Self); )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2017, 15:46:37 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_Bred eFeMпропущено... Опять по новому кругу. Ну открой ты исходники и посмотри TThread.Create, TThread.Destroy Bred eFeMСитуация, когда в рамках одного процесса действительно нужна копия хэндла, мне непонятна.Хендлом владеет экземпляр класса TThread. Он его порождает, он же его и убивает. Если хэндл используется где-то вне этого объекта и существует вероятность обращения к этому хэндлу после уничтожения объекта, то нужно делать копию Я дико извиняюсь, но Handle - это сущность, которой владеет процесс, а не поток. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2017, 17:08:12 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
schiЯ дико извиняюсь, но Handle - это сущность, которой владеет процесс, а не поток.И что? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2017, 17:11:06 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_schiЯ дико извиняюсь, но Handle - это сущность, которой владеет процесс, а не поток.И что? Эта фраза "Хендлом владеет экземпляр класса TThread. Он его порождает, он же его и убивает. Если хэндл используется где-то вне этого объекта и существует вероятность обращения к этому хэндлу после уничтожения объекта, то нужно делать копию " меня напрягла. Как только ты сделал DuplicateHandle, тебе надо его явно закрывать, причем всегда, иначе объект потока будет жить вечно. И зачем этот зомби нужен ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2017, 17:26:54 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
schiКак только ты сделал DuplicateHandle, тебе надо его явно закрывать, причем всегда, иначе объект потока будет жить вечноА где я говорил другое?_Vasilisk_Только не забудь сам вызвать CloseHandle() для полученной копии ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2017, 17:51:58 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#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 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
Доккорректно - это когда каждый раз, как в первый раз. Нет? :)это называется детерминированное поведение ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2017, 10:58:05 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)это называется детерминированное поведение Ага, а пригляделась получше ... :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2017, 11:13:41 |
|
||
|
|

start [/forum/topic.php?all=1&fid=58&tid=2042091]: |
0ms |
get settings: |
6ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
195ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
43ms |
get tp. blocked users: |
1ms |
| others: | 193ms |
| total: | 459ms |

| 0 / 0 |
