|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
06.05.2012, 17:18 | #1 |
Участник клуба Подтвердите свой е-майл
Регистрация: 26.01.2008
Сообщений: 1,897
|
Завершить работу потока при закрытии формы
Код:
Последний раз редактировалось Shouldercannon; 07.05.2012 в 14:13. |
08.05.2012, 11:07 | #2 |
Сумрачная тень
Форумчанин
Регистрация: 05.03.2009
Сообщений: 689
|
Если вызываете WaitFor, то эта строчка ошибочна:
Код:
"ковыряю изнутри" (с)
|
08.05.2012, 19:39 | #3 |
Участник клуба Подтвердите свой е-майл
Регистрация: 26.01.2008
Сообщений: 1,897
|
Эксперементировал над этим кодом
Код:
|
08.05.2012, 19:52 | #4 |
Сумрачная тень
Форумчанин
Регистрация: 05.03.2009
Сообщений: 689
|
Ну вот скажите, а почему бы критическую секцию не поместить в сам поток? Переопределите класс, добавьте в protected все что ему нужно для работы, абстрагируйте логику, опишите конструктор и деструктор по-человечески. Поверьте, станет сразу проще думать, ошибок глупых не будет.
А теперь по коду. И сразу ошибка-опечатка: дважды вызываете в Execute CriticalSection.Enter; Во-вторых, критическая секция может быть использована ранее, чем уничтожится поток, т.к. метод Terminate устанавливает свойство terminated в true. Ну, чтобы ваш код работал, нужно подправить так: Код:
"ковыряю изнутри" (с)
|
08.05.2012, 21:14 | #5 |
Участник клуба Подтвердите свой е-майл
Регистрация: 26.01.2008
Сообщений: 1,897
|
Хочу уточнить.
1. При данной конструкции потока и способа его вызова критическая секция вовсе не нужна или я ошибаюсь? Поток ведь создаётся один раз при событии FormShow. 2. Так как поток теперь не уничтожается после выполнения своей задачи (Test_Thread.FreeOnTerminate := False;), то он будет "жить" до тех пор, пока не будет закрыта форма? Последний раз редактировалось Shouldercannon; 08.05.2012 в 21:17. |
08.05.2012, 22:32 | #6 |
Сумрачная тень
Форумчанин
Регистрация: 05.03.2009
Сообщений: 689
|
1. Если нет разделяемых ресурсов, смысл от критической секции нулевой. Просто лишний объект. Однако, если переменная s (видимо, она глобальная) используется где-то еще, то тогда критическая секция нужна.
2. Да, поток будет жить и работать 10000 мс, судя по циклу в Execute. Деструктор потока нужно будет вызывать вручную, см. выше событие FormClose в моем посте. Я бы посоветовал переменную s внести в класс потока, там с ней оперировать. Лучше стремиться к изоляции логики, а не размазывать ее по всем классам в коде. P.S. Работу с критическими секциями и любыми объектами синхронизации с парной структурой вызова лучше оформлять в блок try..finally для безопасности и надежности.
"ковыряю изнутри" (с)
Последний раз редактировалось 3D Hunter; 08.05.2012 в 22:35. |
08.05.2012, 22:49 | #7 | |
Участник клуба Подтвердите свой е-майл
Регистрация: 26.01.2008
Сообщений: 1,897
|
Цитата:
Код:
|
|
09.05.2012, 09:20 | #8 |
Сумрачная тень
Форумчанин
Регистрация: 05.03.2009
Сообщений: 689
|
Тогда отлично заработало у вас?
"ковыряю изнутри" (с)
|
09.05.2012, 09:30 | #9 |
Участник клуба Подтвердите свой е-майл
Регистрация: 26.01.2008
Сообщений: 1,897
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Как выскочить из цикла for при закрытии формы? | men232 | Общие вопросы Delphi | 16 | 08.10.2011 13:16 |
ошибка при закрытии формы | TotKtoNado | Общие вопросы Delphi | 3 | 03.07.2011 19:20 |
при закрытии потока(Tthread) посылать на форму код ответа или сообщение | Человек_Борща | Общие вопросы Delphi | 2 | 14.12.2010 21:19 |
запуск процесса при закрытии формы | RUSlan48 | Общие вопросы Delphi | 3 | 29.03.2010 21:49 |
Сворачивание в трей при закрытии формы | xxxsas | Общие вопросы C/C++ | 0 | 22.01.2009 08:11 |