powered by simpleCommunicator - 2.0.37     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Не завершается поток при закрытии приложения.
9 сообщений из 9, страница 1 из 1
Не завершается поток при закрытии приложения.
    #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
Не завершается поток при закрытии приложения.
    #40092412
Страдалецъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя если перенести этот код в Destroy для формы, то отладчик матюгается, но приложение нормально завершается.
...
Рейтинг: 0 / 0
Не завершается поток при закрытии приложения.
    #40092415
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Страдалецъ,

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

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

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

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

Миф №14: Obj.Free не приводит к Obj = nil
...
Рейтинг: 0 / 0
Не завершается поток при закрытии приложения.
    #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
9 сообщений из 9, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Не завершается поток при закрытии приложения.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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