powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Корректное завершение потока
25 сообщений из 51, страница 1 из 3
Корректное завершение потока
    #39476324
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в приложении есть треды (один, два, десять, хоть сто).
Пытаюсь их корректно останавливать.

В закрытии главного окна делаю

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
  while StealthForm.CharListBox.Items.Count > 0 do
  begin
    Char_Obj := TBaseCharacter(StealthForm.CharListBox.Items.Objects[0]);
    StealthForm.CharListBox.Items.Delete(0);

    if ValidObject(Char_Obj) then
      if Char_Obj.Stop_MainThread then
        Char_Obj.DisposeOf;
  end;




Код: 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.
function TBaseCharacter.Stop_MainThread : Boolean;
var H : THandle;
begin
  Char_Started := False;
  LegalDisposeChar := True;
  {$IFDEF HAS_FMX}
  //Result := Self.WaitFor = 0;
  Self.WaitFor;
  Result := True;
  {$ELSE}
  RemoveQueuedEvents(Self);
  if TThread.CurrentThread.ThreadID <> MainThreadID then
    Result := WaitForSingleObject(Handle, 10000) <> WAIT_TIMEOUT
  else
  begin
    H := Handle;
    while True do
      case MsgWaitForMultipleObjects(1,H, False, 10000, QS_ALLEVENTS) of
        WAIT_OBJECT_0 : Exit(True);
        WAIT_OBJECT_0 + 1 : if Assigned(ProcessMessagesProc) then ProcessMessagesProc;
        WAIT_TIMEOUT : Exit(False);
      end;
  end;
  {$ENDIF}
end;



Проблема тут - 10с проходит, WAIT_TIMEOUT не срабатывает. Не срабатывает он и потом.
В отладке же чудеса - если кидаю бряк на выход из процедуры - срабатывает таймаут нормально. Но чудес же не бывает.

Я что-то делаю не так?
...
Рейтинг: 0 / 0
Корректное завершение потока
    #39476336
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to get extended information call GetLastError
...
Рейтинг: 0 / 0
Корректное завершение потока
    #39476351
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
error нет.
есть MsgWaitForMultipleObjects, который крутится себе в вечном цикле, сообщения оконные обрабатывает, все такое - но выходить не выходит, ни по таймауту, ни с ошибкой.
...
Рейтинг: 0 / 0
Корректное завершение потока
    #39476355
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vizit0r,

На АОПе еще кто-то играет?
...
Рейтинг: 0 / 0
Корректное завершение потока
    #39476369
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КвейдVizit0r,

На АОПе еще кто-то играет?


ты задаешь этот вопрос уже второй или третий раз.
Я не в курсе, я не играю ни там, ни вообще на каком-то шарде.
...
Рейтинг: 0 / 0
Корректное завершение потока
    #39476415
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если сделать так?

Код: pascal
1.
2.
3.
4.
5.
6.
      case MsgWaitForMultipleObjects(1,H, False, 10000, QS_ALLEVENTS) of
        WAIT_OBJECT_0 : Exit(True);
        WAIT_OBJECT_0 + 1 : if Assigned(ProcessMessagesProc) then ProcessMessagesProc;
      else
        Exit(False);
      end;
...
Рейтинг: 0 / 0
Корректное завершение потока
    #39476416
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vizit0rWAIT_TIMEOUT не срабатываеЗначит срабатывает, что-то другое. Например, WAIT_FAILED, что приводит к бесконечному циклу. А сам WAIT_FAILED возникает из-за того, что был вызван деструктор потока, который закрыл хэндл, и Вы ломитесь по невалидному хендлу. Чтобы такого не происходило, нужн
1) Заблаговременно вызывать DuplicateHandle
2) Предусматривать ВСЕ возможные возвращаемые значения
Vizit0rВ отладке же чудеса - если кидаю бряк на выход из процедуры - срабатывает таймаут нормальноПотому что меняется тайминг и поток не успевает вызвать деструктор
...
Рейтинг: 0 / 0
Корректное завершение потока
    #39476831
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну деструктор не вызывается, потому что FreeOnTerminate = False, но ход мыслей я понял.

Кстати, а DuplicateHandle зачем?
...
Рейтинг: 0 / 0
Корректное завершение потока
    #39476832
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vizit0rКстати, а DuplicateHandle зачем?Чтобы, когда поток сделает своему хэндлу CloseHandle() у тебя осталась валидная копия
...
Рейтинг: 0 / 0
Корректное завершение потока
    #39476845
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
интересно.
Не знал, спасибо.
...
Рейтинг: 0 / 0
Корректное завершение потока
    #39476868
Bred eFeM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_, когда поток сам делает своему хэндлу CloseHandle() то это, наверное, не очень правильно ?
...
Рейтинг: 0 / 0
Корректное завершение потока
    #39477018
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bred eFeMкогда поток сам делает своему хэндлу CloseHandle() то это, наверное, не очень правильно ?Почему? Что в этом не правильного? Есть класс TThread, который инкапсулирует работу с потоком. Этот класс в своем конструкторе создает поток и получает его хэндл. Будет вполне логично этот хэндл закрыть, когда у класса отпадет в нем необходимость. Что он и делает. Закрыти хэндла на работоспособность потока никак не влияет
...
Рейтинг: 0 / 0
Корректное завершение потока
    #39477020
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vizit0rинтересно.
Не знал, спасибо.Только не забудь сам вызвать CloseHandle() для полученной копии
...
Рейтинг: 0 / 0
Корректное завершение потока
    #39477042
Bred eFeM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Только не забудь сам вызвать CloseHandle() для полученной копиивот-вот, а по сути, конструктор то у тебя вне потока получает этот Handle, значит, архитектурно правильно, его и закрыть вне потока.
...
Рейтинг: 0 / 0
Корректное завершение потока
    #39477068
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Vizit0rинтересно.
Не знал, спасибо.Только не забудь сам вызвать CloseHandle() для полученной копии

ну это само собой.
...
Рейтинг: 0 / 0
Корректное завершение потока
    #39477186
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bred eFeMвот-вот, а по сути, конструктор то у тебя вне потока получает этот Handle, значит, архитектурно правильно, его и закрыть вне потока.Хэндл получается в конструкторе класса, закрывается в деструкторе класса. Что не так?
...
Рейтинг: 0 / 0
Корректное завершение потока
    #39477203
Bred eFeM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_ Что не так?DuplicateHandle зачем?
...
Рейтинг: 0 / 0
Корректное завершение потока
    #39477337
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bred eFeM,

_Vasilisk_Vizit0rКстати, а DuplicateHandle зачем?Чтобы, когда поток ( читать - объект класса TThread ) сделает своему хэндлу CloseHandle() у тебя осталась валидная копия
...
Рейтинг: 0 / 0
Корректное завершение потока
    #39477386
Bred eFeM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_когда поток (читать - объект класса TThread) сделает своему хэндлу CloseHandle() конструктор то у тебя вне потока получает этот Handle, значит, архитектурно правильно, его и закрыть вне потока Ситуация, когда в рамках одного процесса действительно нужна копия хэндла, мне непонятна.
...
Рейтинг: 0 / 0
Корректное завершение потока
    #39477761
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bred eFeMконструктор то у тебя вне потока получает этот Handle, значит, архитектурно правильно, его и закрыть вне потока Опять по новому кругу. Ну открой ты исходники и посмотри TThread.Create, TThread.Destroy
Bred eFeMСитуация, когда в рамках одного процесса действительно нужна копия хэндла, мне непонятна.Хендлом владеет экземпляр класса TThread. Он его порождает, он же его и убивает. Если хэндл используется где-то вне этого объекта и существует вероятность обращения к этому хэндлу после уничтожения объекта, то нужно делать копию
...
Рейтинг: 0 / 0
Корректное завершение потока
    #39477786
Bred eFeM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_, как это хэндл используется где-то вне этого объекта после класс TThread, который инкапсулирует работу с потоком.
Ладно, CloseThread(Self); ))
...
Рейтинг: 0 / 0
Корректное завершение потока
    #39477844
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Bred eFeMпропущено...
Опять по новому кругу. Ну открой ты исходники и посмотри TThread.Create, TThread.Destroy
Bred eFeMСитуация, когда в рамках одного процесса действительно нужна копия хэндла, мне непонятна.Хендлом владеет экземпляр класса TThread. Он его порождает, он же его и убивает. Если хэндл используется где-то вне этого объекта и существует вероятность обращения к этому хэндлу после уничтожения объекта, то нужно делать копию

Я дико извиняюсь, но Handle - это сущность, которой владеет процесс, а не поток.
...
Рейтинг: 0 / 0
Корректное завершение потока
    #39477853
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schiЯ дико извиняюсь, но Handle - это сущность, которой владеет процесс, а не поток.И что?
...
Рейтинг: 0 / 0
Корректное завершение потока
    #39477873
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_schiЯ дико извиняюсь, но Handle - это сущность, которой владеет процесс, а не поток.И что?

Эта фраза "Хендлом владеет экземпляр класса TThread. Он его порождает, он же его и убивает. Если хэндл используется где-то вне этого объекта и существует вероятность обращения к этому хэндлу после уничтожения объекта, то нужно делать копию "
меня напрягла. Как только ты сделал DuplicateHandle, тебе надо его явно закрывать, причем всегда, иначе объект потока будет жить вечно. И зачем этот зомби нужен ?
...
Рейтинг: 0 / 0
Корректное завершение потока
    #39477898
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schiКак только ты сделал DuplicateHandle, тебе надо его явно закрывать, причем всегда, иначе объект потока будет жить вечноА где я говорил другое?_Vasilisk_Только не забудь сам вызвать CloseHandle() для полученной копии
...
Рейтинг: 0 / 0
25 сообщений из 51, страница 1 из 3
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Корректное завершение потока
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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