powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как правильно заморозить поток из самого себя?
24 сообщений из 74, страница 3 из 3
Как правильно заморозить поток из самого себя?
    #40050355
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, но ничего я выкидывать не буду, пока всё работает нормально
...
Рейтинг: 0 / 0
Как правильно заморозить поток из самого себя?
    #40050356
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11
а вот если нужно принудительно остановить работу потока:
Код: pascal
1.
2.
3.
4.
SendNotifyThread.StopSendNotify := true;
SendNotifyThread.Terminate;
SetEvent(SendNotifyThread.EventHandle);
SendNotifyThread := nil;


Замени это на FreeAndNil( SendNotifyThread );
...
Рейтинг: 0 / 0
Как правильно заморозить поток из самого себя?
    #40050357
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11
Спасибо, но ничего я выкидывать не буду, пока всё работает нормально

Зачем нам вопросы задавать, если лучше нас знаешь, как лучше.
П.С. Работает хоть как-то - очень случайно, это не нормально.
...
Рейтинг: 0 / 0
Как правильно заморозить поток из самого себя?
    #40050359
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock
Замени это на FreeAndNil( SendNotifyThread );


Ты ведь даже не знаешь, что делает StopSendNotify(), а требуешь это убрать
...
Рейтинг: 0 / 0
Как правильно заморозить поток из самого себя?
    #40050363
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11
YuRock
Замени это на FreeAndNil( SendNotifyThread );


Ты ведь даже не знаешь, что делает StopSendNotify(), а требуешь это убрать

Конечно же я знаю, что это такое. Протёр свой шар с утра.
Если эта переменная не полностью бесполезна и не только дублирует Terminated, то перенеси ее в деструктор (возле Terminate;), да и всё.
...
Рейтинг: 0 / 0
Как правильно заморозить поток из самого себя?
    #40050372
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockОсвобождение объекта (или хэндла) эвента - после inherited Destroy (после этого Execute
уже гарантированно завершен).

Да ну? Это ты гарантируешь вызовом Terminate и SetEvent в деструкторе ?.. Ню-ню...


Раздел Рустама всегда полон людей, стреляющих себе в ногу, выходящих в окно и делающих
прочие самоубийственные глупости в стиле мистера Бина.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как правильно заморозить поток из самого себя?
    #40050374
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
YuRockОсвобождение объекта (или хэндла) эвента - после inherited Destroy (после этого Execute
уже гарантированно завершен).

Да ну? Это ты гарантируешь вызовом Terminate и SetEvent в деструкторе ?.. Ню-ню...


Раздел Рустама всегда полон людей, стреляющих себе в ногу, выходящих в окно и делающих
прочие самоубийственные глупости в стиле мистера Бина.
Без всяких ну.
Я это гарантирую вызовом inherited Destroy, в котором вызывается WaitFor.
Dimitry Sibiryakov
Раздел Рустама всегда полон людей, стреляющих себе в ногу, выходящих в окно

И любителей пукнуть в лужу.
...
Рейтинг: 0 / 0
Как правильно заморозить поток из самого себя?
    #40050377
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эмм, из простейшей задачи раздули в непойми что)))
...
Рейтинг: 0 / 0
Как правильно заморозить поток из самого себя?
    #40050379
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asutp2
Эмм, из простейшей задачи раздули в непойми что)))
Задачи, как оказалось, не было. У ТС всё прекрасно работает.
...
Рейтинг: 0 / 0
Как правильно заморозить поток из самого себя?
    #40050380
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asutp2
Эмм, из простейшей задачи раздули в непойми что)))


я в шоке просто

ну да ,я пока решил вопрос с помощью
Код: pascal
1.
2.
Sleep(1000);
Continue;



хоть это и некорректно может быть, но проц не грузит
...
Рейтинг: 0 / 0
Как правильно заморозить поток из самого себя?
    #40050381
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11
asutp2
Эмм, из простейшей задачи раздули в непойми что)))


я в шоке просто

ну да ,я пока решил вопрос с помощью
Код: pascal
1.
2.
Sleep(1000);
Continue;




хоть это и некорректно может быть, но проц не грузит
Жаль.
...
Рейтинг: 0 / 0
Как правильно заморозить поток из самого себя?
    #40050421
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
Это ты гарантируешь вызовом Terminate и SetEvent в деструкторе ?..
А в чем проблема?
...
Рейтинг: 0 / 0
Как правильно заморозить поток из самого себя?
    #40050424
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_А в чем проблема?

FreeOnTerminate. Деструктор вызывается уже после того, как Execute завершилось.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как правильно заморозить поток из самого себя?
    #40050463
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
FreeOnTerminate. Деструктор вызывается уже после того, как Execute завершилось.
Допустим. Но ничего фатального кроме лишних телодвижений не происходит.

Главное, чтобы Event не закрыли по выходу из Execute
...
Рейтинг: 0 / 0
Как правильно заморозить поток из самого себя?
    #40050497
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11
asutp2
Эмм, из простейшей задачи раздули в непойми что)))


я в шоке просто

ну да ,я пока решил вопрос с помощью
Код: pascal
1.
2.
Sleep(1000);
Continue;



хоть это и некорректно может быть, но проц не грузит


Рекомендую все-таки почитать статью по многопоточному программированию. Сколько ещё лет можно не разбираться с этой темой?
...
Рейтинг: 0 / 0
Как правильно заморозить поток из самого себя?
    #40050501
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
кроме лишних телодвижений
Каких лишних? Terminate лишний, потому что он есть в Destroy? Так он нужен обязательно до SetEvent.
Так-то я давно наследника написал с созданием в конструкторе этого эвента и этими тремя (четырьмя, с освобождением эвента после inherited) строчками в деструкторе. И использую его если не всегда, то почти всегда.
...
Рейтинг: 0 / 0
Как правильно заморозить поток из самого себя?
    #40050502
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Читал только часть последней страницы - если извне объект потока "трогают", то никаких FreeOnTerminate.
PS: если есть хоть малейшее недопонимание TThread
...
Рейтинг: 0 / 0
Как правильно заморозить поток из самого себя?
    #40050548
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry Arefiev,

ну вроде бы нету, даже syncronize не использую за ненадобностью.
...
Рейтинг: 0 / 0
Как правильно заморозить поток из самого себя?
    #40050652
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock
Каких лишних? Terminate лишний, потому что он есть в Destroy? Так он нужен обязательно до SetEvent.
Если FreeOnTerminate = True, то поток уже остановлен. Поэтому именно в этом случае остановка в деструкторе лишняя
...
Рейтинг: 0 / 0
Как правильно заморозить поток из самого себя?
    #40050695
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
YuRock
Каких лишних? Terminate лишний, потому что он есть в Destroy? Так он нужен обязательно до SetEvent.
Если FreeOnTerminate = True, то поток уже остановлен...
С чего ты так решил? Это флаг, который регулирует поведение при остановке потока. Его можно устанавливать хоть в конструкторе при запуске потока, а остановиться поток может и через месяц, и всё это время FreeOnTerminate = True...
...
Рейтинг: 0 / 0
Как правильно заморозить поток из самого себя?
    #40050704
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asutp2Это флаг, который регулирует поведение при остановке потока.

Прааавильно. А тепепь попробуй подумать когда и откуда будет вызываться деструктор потока
если этот флаг установлен.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как правильно заморозить поток из самого себя?
    #40050731
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

а что думать? смотрим функцию ThreadProc в System.Classes.pas, там всё очевидно:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
  try
    Thread.FStarted := True;
    if not Thread.Terminated then
    try
      Thread.Execute;
    except
      Thread.FFatalException := AcquireExceptionObject;
    end;
  finally
    Result := Thread.FReturnValue;
    FreeThread := Thread.FFreeOnTerminate;
    Thread.DoTerminate;
    Thread.FFinished := True;
    SignalSyncEvent;
    if FreeThread then
    begin
      Thread.DisposeOf;


Соответственно FreeOnTerminate проверяется после завершения работы Thread.Execute, со всеми вытекающими.
Другой вопрос, что если у потока флаг FreeOnTerminate установлен, то хранить ссылку на него и обращаться по ней чревато экспешенами, т.к. поток может завершится в произвольный момент и сохраненные ссылки на него станут невалидными.
...
Рейтинг: 0 / 0
Как правильно заморозить поток из самого себя?
    #40050736
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О чём, собственно, тут и говорилось всю последнюю страницу.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как правильно заморозить поток из самого себя?
    #40050748
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
YuRock
Каких лишних? Terminate лишний, потому что он есть в Destroy? Так он нужен обязательно до SetEvent.
Если FreeOnTerminate = True, то поток уже остановлен. Поэтому именно в этом случае остановка в деструкторе лишняя
Понятно. Но FreeOnTerminate тут вообще лишний (т.к. вечный цикл). И я когда это писал даже вообразить не мог, что этот поток FreeOnTerminate.
...
Рейтинг: 0 / 0
24 сообщений из 74, страница 3 из 3
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как правильно заморозить поток из самого себя?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]