Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 04.06.2019, 18:34
Valimer Valimer вне форума
Прохожий
 
Регистрация: 04.06.2019
Сообщения: 1
Версия Delphi: 10.2.3
Репутация: 10
По умолчанию Проблема с завершением потока после завершения события

Код:
unit Unit1;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs,sip,sipclient, Vcl.StdCtrls, sEdit,
  sButton,call, Vcl.ExtCtrls;
 
type
  TForm1 = class(TForm)
    sButton1: TsButton;
    sButton2: TsButton;
    sEdit1: TsEdit;
    Memo1: TMemo;
    sEdit2: TsEdit;
    sEdit3: TsEdit;
    sEdit4: TsEdit;
    procedure sButton1Click(Sender: TObject);
    procedure sButton2Click(Sender: TObject);
  private
    { Private declarations }
  public
  number:string;
  host,password,user:string;
  end;
 
type
  TMyClass = class(TObject)
public
  SIP1:TSipClient;
  call: Icall;
  procedure SipClientRegistration(Sender: TObject; const Registered: Boolean);
  procedure SipClientCall(Sender: TObject; const ACall: ICall);
  procedure callme;
  constructor Create();
  destructor Delete();
end;
 
  TmyThread = class(TThread)
  private
  { private declarations }
  protected
    procedure Execute; override;
  end;
 
 
 
 
 
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TMyClass.callme;
begin
call:= SIP1.Call(Form1.number);
end;
 
constructor TMyClass.Create;
begin
  inherited;
  SIP1:= TSipClient.Create(nil);
  sip1.Host:=Form1.host;
  SIP1.User:=Form1.user;
  SIP1.Password:=Form1.password;
  SIP1.OnRegistration := SipClientRegistration;
  SIP1.OnCall:=  SipClientCall;
  SIP1.Active:=True;
  SIP1.Register;
end;
 
destructor TMyClass.Delete;
begin
  inherited;
end;
 
procedure TMyClass.SipClientRegistration(Sender: TObject; const Registered: Boolean);
begin
if Registered then callme else ShowMessage('не верный логин/пароль');
end;
 
 
 
procedure TMyClass.SipClientCall(Sender: TObject; const ACall: ICall);
begin
call:= Acall;
call.Answer;
end;
 
procedure TForm1.sButton1Click(Sender: TObject);
var
th: TmyThread;
begin
number:=Self.sEdit1.Text;
host:= self.sEdit2.Text;
user:= Self.sEdit3.Text;
password:= self.sEdit4.Text;
th:= TmyThread.Create(True);
th.FreeOnTerminate:=True;
th.start;
end;
 
procedure TmyThread.Execute;
var
MyClass: TMyClass;
begin
MyClass:= TMyClass.Create;
repeat
sleep(3000);
self.Queue(
procedure
begin
Form1.Memo1.Lines.Add('ничего не делаю, жду пока умру');
end);
 
until terminated;
end;
 
 
 
procedure TForm1.sButton2Click(Sender: TObject);
var
MyClass: TMyClass absolute Sender;
begin
MyClass.call.EndCall;
MyClass.call:= nil;
 
end;
 
end.

В общем сделал для примера что-то в этом роде, в общем поток вообще не умирает и не выполняет, хотя если написать th.execute; то без потока все выходит идеально. Т.е. поток завершается раньше чем событие, а если я его задерживаю, он не умирает в общем
Ответить с цитированием
  #2  
Старый 04.06.2019, 19:26
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну все правильно.
Сам поток у тебя крутится в цикле, пока он не будет терминирован извне.
А создаешь ты его в локальной переменной события. Т.е. даже нет указателя, что бы прервать поток откуда-то снаружи. Соответсвенно, твой поток умрет только вместе с основным процессом. Ровно то, что ты и видишь.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 01:12.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter