powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Зависает WaitForSingleObject
25 сообщений из 34, страница 1 из 2
Зависает WaitForSingleObject
    #39938914
VirtaOtec
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В каких случаях может зависать "WaitForSingleOnject(..., INFINITE);"? Вызываю destroy(); у TThread, и доходя до вызова этой функции, поток, вызвавший destroy(); другого (вложенного) потока, зависает.
...
Рейтинг: 0 / 0
Зависает WaitForSingleObject
    #39938923
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что является хендлом?
...
Рейтинг: 0 / 0
Зависает WaitForSingleObject
    #39938927
VirtaOtec
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
X-Cite , видимо, Handle завершаемого потока. Это подставляется автоматически в TThread.
...
Рейтинг: 0 / 0
Зависает WaitForSingleObject
    #39938928
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VirtaOtecВ каких случаях может зависать "WaitForSingleOnject(..., INFINITE);"?

Когда ожидаемый объект не переходит в возбуждённое состояние. Ну или проще: когда
программист не понимает что он делает.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Зависает WaitForSingleObject
    #39938930
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VirtaOtec,

А у вас выход из Execute вложенного потока происходит? (Если там цикл бесконечный...)
...
Рейтинг: 0 / 0
Зависает WaitForSingleObject
    #39938932
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
procedure TForm1.Button1Click(Sender: TObject);
begin
  var a := TThread.CreateAnonymousThread(
    procedure
    begin
      var b := TThread.CreateAnonymousThread(
        procedure
        begin
          while True do
            ;
        end
      );
      b.FreeOnTerminate := False;
      b.Start();
      Sleep(100);
      b.Free(); // Зависнет, потому что  while True do ;
    end
  );
  a.FreeOnTerminate := False;
  a.Start();
  Sleep(100);
  a.Free();
end;
...
Рейтинг: 0 / 0
Зависает WaitForSingleObject
    #39938957
VirtaOtec
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
X-Cite , в том и дело, что в Execute выход происходит. Выложить код не могу, потому что программа очень большая. Пытался повторить ошибку на какой-нибудь маленькой программе, но не получается. Не получается ошибиться! Вот и думаю, может быть, кто-нибудь знает по опыту, по каким причинам могут возникать такие проблемы.
...
Рейтинг: 0 / 0
Зависает WaitForSingleObject
    #39938969
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VirtaOtec
Вот и думаю, может быть, кто-нибудь знает по опыту, по каким причинам могут возникать такие проблемы.

Со стороны эта просьба выглядит так: "Код не покажу, угадайте - "почему?".
...
Рейтинг: 0 / 0
Зависает WaitForSingleObject
    #39939000
Valery_B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VirtaOtec
В каких случаях может зависать "WaitForSingleOnject

Когда WaitForSingleObject ждёт поток, который делает Synchronize.

Глюк TThread в связке WaitForSingleObject
...
Рейтинг: 0 / 0
Зависает WaitForSingleObject
    #39939079
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VirtaOtecпо каким причинам могут возникать такие проблемы.

И ты будешь проверять каждую из туевой хучи таких причин?

Не майся дурью, в момент зависания смотри CallStack всех потоков и определяй причину дедлока.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Зависает WaitForSingleObject
    #39940382
VirtaOtec
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все вдруг стало ясно и понятно, а как исправить - не знаю. Ситуация в следующем: есть родительский поток и другой поток, вложенный в него. Вовне происходит нечто, что заставляет вложенный поток сгенерировать некое событие, в ответ на которое родительский поток его удаляет. И, видимо, в этом проблема: так как родительский поток удаляет вложенный по его же запросу, то из-за этого вложенный и зависает на вызове "WaitFor()" - (предполагаю,) потому что вызов "WaitFor()" происходит из контекста вложенного потока.

Так ли это? Если да, то как бороть?
...
Рейтинг: 0 / 0
Зависает WaitForSingleObject
    #39940387
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VirtaOtec
Все вдруг стало ясно и понятно, а как исправить - не знаю. Ситуация в следующем: есть родительский поток и другой поток, вложенный в него. Вовне происходит нечто, что заставляет вложенный поток сгенерировать некое событие, в ответ на которое родительский поток его удаляет. И, видимо, в этом проблема: так как родительский поток удаляет вложенный по его же запросу, то из-за этого вложенный и зависает на вызове "WaitFor()" - (предполагаю,) потому что вызов "WaitFor()" происходит из контекста вложенного потока.

Так ли это? Если да, то как бороть?


Ты как про что-то, не тобой сделанное, рассказываешь.
Или ты тоже не видишь "проблемный" код, как и мы?
...
...eсли WaitFor*() делает не то, что ты от него ждешь - для чего ты его вообще используешь?
...
Рейтинг: 0 / 0
Зависает WaitForSingleObject
    #39940391
VirtaOtec
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ъъъъъ , я использую не "WaitFor()" напрямую, но вызывается он автоматически в Delphi при вызове "TThread.destroy()", и там же и зависает.
...
Рейтинг: 0 / 0
Зависает WaitForSingleObject
    #39940393
VirtaOtec
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Варианты пока такие:

1. Вызывать удаление вложенного потока в TThread.queue().
2. Поставить вложенному потоку "FreeOnTerminate := true" и удалять его через "TThread.terminate()".

Либо, еще какие-то есть?
...
Рейтинг: 0 / 0
Зависает WaitForSingleObject
    #39940436
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VirtaOtec,

код то покажи, желательно в самом простом варианте повторения проблемы
гаданием и снятием порчи по фотографии другие люди занимаются
...
Рейтинг: 0 / 0
Зависает WaitForSingleObject
    #39940454
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VirtaOtec,

использую простое правило - поток сам себя не удаляет, просто нотифицирует родительский о том, что он закончил работу. Как это сделать - вариантов много: через оконные сообщения, через переменные, через очереди, можно просто завершиться, а родительский раз в 100 мсек проверяет его статус и если он закончился вызывает ему Free
...
Рейтинг: 0 / 0
Зависает WaitForSingleObject
    #39940464
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как реализовано это "некое событие"?
...
Рейтинг: 0 / 0
Зависает WaitForSingleObject
    #39940608
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VirtaOtec, Как узнать почему зависла программа .

Wait Chain потоков - в студию.
...
Рейтинг: 0 / 0
Зависает WaitForSingleObject
    #39940762
VirtaOtec
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ситуация следующая. Есть ParentThread - родительский поток и ChildThread - вложенный. ChildThread был таков:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
TChildThread = class(TThread)
  private
    FOnDeleted: TNotifyEvent;
  protected
    procedure execute(); override;
  public
    constructor create();
    property onDeleted: TNotifyEvent read FOnDeleted write FOnDeleted;
end;

procedure TChildThread.execute();
begin
  sleep(6250);

  if (assigned(FOnDeleted)) then onDeleted(self);
end;



А ParentThread - таков:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
TParentThread = class(TThread)
  private
    childThread: TChildThread;
  protected
    procedure execute(); override;
  public
    constructor create();
    destructor destroy(); override;
    procedure removeChild(sender: TObject);
end;

constructor TParentThread.create();
begin
  inherited create(false);

  childThread := TChildThread.create();
  childThread.onDeleted := removeChild;
end;

procedure TParentThread.removeChild(sender: TObject);
begin
  childThread.destroy();
end;



Зависает на "childThread.destroy()", если после этой строки поместить еще функцию, то до нее компилятор не дойдет. Зависновение происходит в стандартном "TThread.destroy()" на вызове "waitFor()".
...
Рейтинг: 0 / 0
Зависает WaitForSingleObject
    #39940782
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VirtaOtec,

а по твоему обработчик TParentThread.removeChild в каком потоке вызывается и кого ждёт?

Код: pascal
1.
2.
3.
4.
5.
6.
procedure TChildThread.execute();
begin
  sleep(6250);

  if (assigned(FOnDeleted)) then onDeleted(self);       ->>>>>
end;
...
Рейтинг: 0 / 0
Зависает WaitForSingleObject
    #39940827
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VirtaOtec
Код: pascal
1.
2.
3.
constructor TParentThread.create();
begin
  childThread := TChildThread.create();


Это вызывается в основном потоке.
...
Рейтинг: 0 / 0
Зависает WaitForSingleObject
    #39940847
zedxxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
По сути, вот что вы написали:
Код: pascal
1.
2.
3.
4.
procedure TChildThread.execute();
begin
  if (assigned(FOnDeleted)) then Self.destroy();
end;


Но так делать нельзя.

Решение: не вызывать деструктор в OnDeleted, а просто установить некий белевый флаг CanFreeChild := True и вызывать деструктор из родительского потока в Execute:

Код: 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.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
TParentThread = class(TThread)
  private
    childThread: TChildThread;
    CanFreeChild: Boolean;           // <<< 1
  protected
    procedure execute(); override;
  public
    constructor create();
    destructor destroy(); override;
    procedure removeChild(sender: TObject);
end;

constructor TParentThread.create();
begin
  inherited create(false);

  childThread := TChildThread.create();
  childThread.onDeleted := removeChild;
end;

procedure TParentThread.removeChild(sender: TObject);
begin
  CanFreeChild := True; // <<< 2  
end;

procedure TParentThread.execute();
begin
  while not Terminated do begin
    ...
    if CanFreeChild then begin  // <<< 3
      FreeAndNil(childThread);
      CanFreeChild := False;
    end;

  end;
end;
...
Рейтинг: 0 / 0
Зависает WaitForSingleObject
    #39941004
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zedxxx
Решение: не вызывать деструктор в OnDeleted, а просто установить некий белевый флаг CanFreeChild := True и вызывать деструктор из родительского потока в Execute
FreeOnTerminated будет достаточно
...
Рейтинг: 0 / 0
Зависает WaitForSingleObject
    #39941022
zedxxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_, Ну да. Но это синтетический и упрощённый пример того, как послать сообщение родительскому потоку о завершении работы и передать ему управление. У топикстартера с этим проблема. К тому же, в реальной жизни дочерний поток может и не нужно убивать или есть какая-то причина, почему именно родительский поток должен управлять временем жизни дочернего.
...
Рейтинг: 0 / 0
Зависает WaitForSingleObject
    #39941045
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VirtaOtec,

У вас в потоках выполняется что-то одноразовое действие или у вас там циклическая очередь по сути?
...
Рейтинг: 0 / 0
25 сообщений из 34, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Зависает WaitForSingleObject
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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