Гость
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Не завершается поток при закрытии приложения. / 9 сообщений из 9, страница 1 из 1
21.08.2021, 14:13
    #40092411
Страдалецъ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не завершается поток при закрытии приложения.
Суть проблемы. Пытаюсь закрыть окно в процессе работы потока, предварительно его прервав, и получаю исключение.
First chance exception at $763BB512. Exception class EThread with message 'Thread Error: Неверный дескриптор (6)'. Process MoveFiles.exe (19800)
Стек вызовов выглядит так:
Код: plaintext
1.
2.
3.
4.
5.
6.
:763bb512 KERNELBASE.RaiseException + 0x62
System.Classes.TThread.CheckThreadError(6)
System.Classes.TThread.CheckThreadError(???)
System.Classes.TThread.WaitFor
System.Classes.TThread.Destroy
System.TObject.Free
uMain.TfrmMain.FormClose($3C92820,caHide)
а сам код, где происходит исключение так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
procedure TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 if Assigned(FileMovier) and (not FileMovier.Finished)
 then begin
      FileMovier.Terminate;
      FileMovier.Free;
      end;
end;


Странно еще, что после завершение потока FileMovier не уничтожается, хотя имеется FreeOnTerminate := True;
Как это дело побороть?
...
Рейтинг: 0 / 0
21.08.2021, 14:20
    #40092412
Страдалецъ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не завершается поток при закрытии приложения.
Хотя если перенести этот код в Destroy для формы, то отладчик матюгается, но приложение нормально завершается.
...
Рейтинг: 0 / 0
21.08.2021, 15:04
    #40092415
ъъъъъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не завершается поток при закрытии приложения.
Страдалецъ,

ну ты посмотри исподники TThread, там полторы строки.
Код твоей реализации метода .Execute() следит за состоянием свойства Terminated?
...
Рейтинг: 0 / 0
21.08.2021, 17:43
    #40092422
Barmaley57
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не завершается поток при закрытии приложения.
Страдалецъ
хотя имеется FreeOnTerminate := True;
А зачем тогда FileMovier.Free? На нем видать и сыпется.
...
Рейтинг: 0 / 0
21.08.2021, 18:24
    #40092424
zedxxx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не завершается поток при закрытии приложения.
Barmaley57
Страдалецъ
хотя имеется FreeOnTerminate := True;
А зачем тогда FileMovier.Free? На нем видать и сыпется.

Более того, если используется FreeOnTerminate, то ссылку на поток вообще хранить нигде нельзя. Она ведь в любой момент может стать "висячей".
...
Рейтинг: 0 / 0
21.08.2021, 21:03
    #40092437
DmSer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не завершается поток при закрытии приложения.
авторСтранно еще, что после завершение потока FileMovier не уничтожается, хотя имеется FreeOnTerminate := True;

Нужно убрать "FreeOnTerminate := True".
И код FormClose упростится. В нём достаточно одной строки:
FreeAndNil(FileMovier)
...
Рейтинг: 0 / 0
21.08.2021, 21:07
    #40092438
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не завершается поток при закрытии приложения.
Страдалецъ
Стек вызовов выглядит так:

Страдалец, а не пробовал ли ты ну хотя бы посмотреть в этот стек, раз уж поднапрягся и привёл его? Там же первой строкой написано: проблема в методе Free. Ну вот хоть какие-нибудь мысли в связи с этим чтобы появились? Ну хотя бы убрать этот вызов и посмотреть, что будет?
...
Рейтинг: 0 / 0
21.08.2021, 22:26
    #40092450
GunSmoker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не завершается поток при закрытии приложения.
Страдалецъ
if Assigned(FileMovier)
FileMovier.Free;

Миф №14: Obj.Free не приводит к Obj = nil
...
Рейтинг: 0 / 0
21.08.2021, 22:32
    #40092451
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не завершается поток при закрытии приложения.

Имхо, стоит добавить, что иногда всё-таки приводит.

Код: 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.
unit Unit18;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm18 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button2Click(Sender: TObject);
  private
  public
  end;

var
  Form18: TForm18;

implementation

{$R *.dfm}

procedure TForm18.Button2Click(Sender: TObject);
var S: string;
begin
  S := Format('Before freeing: button1 = %p, button2 = %p', [pointer(Button1), pointer(Button2)]);
  Button1.Free;
  S := S + ^M + Format('After freeing: button1 = %p, button2 = %p', [pointer(Button1), pointer(Button2)]);
  ShowMessage(S);
end;

end.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Не завершается поток при закрытии приложения. / 9 сообщений из 9, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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