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

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

А у вас выход из Execute вложенного потока происходит? (Если там цикл бесконечный...)
...
Рейтинг: 0 / 0
18.03.2020, 22:27
    #39938932
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависает WaitForSingleObject
Код: 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
19.03.2020, 07:09
    #39938957
VirtaOtec
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависает WaitForSingleObject
X-Cite , в том и дело, что в Execute выход происходит. Выложить код не могу, потому что программа очень большая. Пытался повторить ошибку на какой-нибудь маленькой программе, но не получается. Не получается ошибиться! Вот и думаю, может быть, кто-нибудь знает по опыту, по каким причинам могут возникать такие проблемы.
...
Рейтинг: 0 / 0
19.03.2020, 08:04
    #39938969
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависает WaitForSingleObject
VirtaOtec
Вот и думаю, может быть, кто-нибудь знает по опыту, по каким причинам могут возникать такие проблемы.

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

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

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

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

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

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

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


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

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

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

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

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

Wait Chain потоков - в студию.
...
Рейтинг: 0 / 0
24.03.2020, 20:16
    #39940762
VirtaOtec
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависает WaitForSingleObject
Ситуация следующая. Есть 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
24.03.2020, 21:13
    #39940782
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависает WaitForSingleObject
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
25.03.2020, 07:05
    #39940827
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависает WaitForSingleObject
VirtaOtec
Код: pascal
1.
2.
3.
constructor TParentThread.create();
begin
  childThread := TChildThread.create();


Это вызывается в основном потоке.
...
Рейтинг: 0 / 0
25.03.2020, 08:26
    #39940847
zedxxx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависает WaitForSingleObject
По сути, вот что вы написали:
Код: 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
25.03.2020, 14:25
    #39941004
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависает WaitForSingleObject
zedxxx
Решение: не вызывать деструктор в OnDeleted, а просто установить некий белевый флаг CanFreeChild := True и вызывать деструктор из родительского потока в Execute
FreeOnTerminated будет достаточно
...
Рейтинг: 0 / 0
25.03.2020, 15:05
    #39941022
zedxxx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависает WaitForSingleObject
_Vasilisk_, Ну да. Но это синтетический и упрощённый пример того, как послать сообщение родительскому потоку о завершении работы и передать ему управление. У топикстартера с этим проблема. К тому же, в реальной жизни дочерний поток может и не нужно убивать или есть какая-то причина, почему именно родительский поток должен управлять временем жизни дочернего.
...
Рейтинг: 0 / 0
25.03.2020, 16:53
    #39941045
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависает WaitForSingleObject
VirtaOtec,

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


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