-
> NoUser © (25.03.16 14:48) [27]
> А чего тогда требует?
OnTerminate через Synchronize вызывается. Теперешний Synchronize уже не использует сообщений как раньше. Подробности см. реализацию Synchronize
-
> NoUser © (25.03.16 14:48) [27]
> А чего тогда требует?
OnTerminate через Synchronize вызывается. Теперешний Synchronize уже не использует сообщений как раньше. Подробности см. реализацию Synchronize
-
> NoUser © (25.03.16 14:48) [27]
> А чего тогда требует?
OnTerminate через Synchronize вызывается. Теперешний Synchronize уже не использует сообщений как раньше. Подробности см. реализацию Synchronize
-
Вот мне и интересно, как сделать основной поток (без окон), чтобы этот OnTerminate там отработал?
-
Вот мне и интересно, как сделать основной поток (без окон), чтобы этот OnTerminate там отработал?
-
Вот мне и интересно, как сделать основной поток (без окон), чтобы этот OnTerminate там отработал?
-
> Вот мне и интересно, как сделать основной поток (без окон), > чтобы этот OnTerminate там отработал?
program Project1;
uses
System.SysUtils, System.Classes;
type
TMyThread = class(TThread)
protected
procedure Execute; override;
end;
TMyClass = class
private
FSecondThread: TMyThread;
procedure ThreadTreminated(Sender: TObject);
public
constructor Create;
destructor Destroy; override;
procedure Run;
end;
var
MyClass: TMyClass;
constructor TMyClass.Create;
begin
inherited Create;
FSecondThread := TMyThread.Create;
FSecondThread.FreeOnTerminate := True;
FSecondThread.OnTerminate := ThreadTreminated;
end;
destructor TMyClass.Destroy;
begin
FSecondThread.Free;
inherited;
end;
procedure TMyClass.Run;
var
i: integer;
begin
for I := 0 to 9 do
begin
Writeln(I);
CheckSynchronize;
Sleep(1000);
end;
end;
procedure TMyClass.ThreadTreminated(Sender: TObject);
begin
Writeln('Second thread terminated');
end;
procedure TMyThread.Execute;
begin
Writeln('Second thread start');
Sleep(2000);
Writeln('Second thread end');
end;
begin
try
MyClass := TMyClass.Create;
try
MyClass.Run;
finally
MyClass.Free;
end;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
Readln;
end.
-
> Вот мне и интересно, как сделать основной поток (без окон), > чтобы этот OnTerminate там отработал?
program Project1;
uses
System.SysUtils, System.Classes;
type
TMyThread = class(TThread)
protected
procedure Execute; override;
end;
TMyClass = class
private
FSecondThread: TMyThread;
procedure ThreadTreminated(Sender: TObject);
public
constructor Create;
destructor Destroy; override;
procedure Run;
end;
var
MyClass: TMyClass;
constructor TMyClass.Create;
begin
inherited Create;
FSecondThread := TMyThread.Create;
FSecondThread.FreeOnTerminate := True;
FSecondThread.OnTerminate := ThreadTreminated;
end;
destructor TMyClass.Destroy;
begin
FSecondThread.Free;
inherited;
end;
procedure TMyClass.Run;
var
i: integer;
begin
for I := 0 to 9 do
begin
Writeln(I);
CheckSynchronize;
Sleep(1000);
end;
end;
procedure TMyClass.ThreadTreminated(Sender: TObject);
begin
Writeln('Second thread terminated');
end;
procedure TMyThread.Execute;
begin
Writeln('Second thread start');
Sleep(2000);
Writeln('Second thread end');
end;
begin
try
MyClass := TMyClass.Create;
try
MyClass.Run;
finally
MyClass.Free;
end;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
Readln;
end.
-
> Вот мне и интересно, как сделать основной поток (без окон), > чтобы этот OnTerminate там отработал?
program Project1;
uses
System.SysUtils, System.Classes;
type
TMyThread = class(TThread)
protected
procedure Execute; override;
end;
TMyClass = class
private
FSecondThread: TMyThread;
procedure ThreadTreminated(Sender: TObject);
public
constructor Create;
destructor Destroy; override;
procedure Run;
end;
var
MyClass: TMyClass;
constructor TMyClass.Create;
begin
inherited Create;
FSecondThread := TMyThread.Create;
FSecondThread.FreeOnTerminate := True;
FSecondThread.OnTerminate := ThreadTreminated;
end;
destructor TMyClass.Destroy;
begin
FSecondThread.Free;
inherited;
end;
procedure TMyClass.Run;
var
i: integer;
begin
for I := 0 to 9 do
begin
Writeln(I);
CheckSynchronize;
Sleep(1000);
end;
end;
procedure TMyClass.ThreadTreminated(Sender: TObject);
begin
Writeln('Second thread terminated');
end;
procedure TMyThread.Execute;
begin
Writeln('Second thread start');
Sleep(2000);
Writeln('Second thread end');
end;
begin
try
MyClass := TMyClass.Create;
try
MyClass.Run;
finally
MyClass.Free;
end;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
Readln;
end.
-
Небольшое уточнение, надо убрать FSecondThread.FreeOnTerminate := True;
-
Небольшое уточнение, надо убрать FSecondThread.FreeOnTerminate := True;
-
Небольшое уточнение, надо убрать FSecondThread.FreeOnTerminate := True;
-
Спасибо, но как я и думал, чуда не произошло - CheckSynchronize. ЗЫ. А какая версия Dx ?
-
Спасибо, но как я и думал, чуда не произошло - CheckSynchronize. ЗЫ. А какая версия Dx ?
-
Спасибо, но как я и думал, чуда не произошло - CheckSynchronize. ЗЫ. А какая версия Dx ?
-
> NoUser © (25.03.16 19:07) [32]
> чуда не произошло - CheckSynchronize.
Разумеется, чуда никакого нет и не может быть. Никто, кроме самого потока не может выполнить код в его контексте. Собственно внутри CheckSynchronize и происходит выборка из очереди действия для выполнения потоком и собственно выполнение.
> А какая версия Dx ? > >
У меня D8. Но CheckSynchronize существует очень давно, в 2009 уже было вроде, а может и раньше.
-
> NoUser © (25.03.16 19:07) [32]
> чуда не произошло - CheckSynchronize.
Разумеется, чуда никакого нет и не может быть. Никто, кроме самого потока не может выполнить код в его контексте. Собственно внутри CheckSynchronize и происходит выборка из очереди действия для выполнения потоком и собственно выполнение.
> А какая версия Dx ? > >
У меня D8. Но CheckSynchronize существует очень давно, в 2009 уже было вроде, а может и раньше.
-
> NoUser © (25.03.16 19:07) [32]
> чуда не произошло - CheckSynchronize.
Разумеется, чуда никакого нет и не может быть. Никто, кроме самого потока не может выполнить код в его контексте. Собственно внутри CheckSynchronize и происходит выборка из очереди действия для выполнения потоком и собственно выполнение.
> А какая версия Dx ? > >
У меня D8. Но CheckSynchronize существует очень давно, в 2009 уже было вроде, а может и раньше.
-
Раньше. В Д2007 точно был.
-
Раньше. В Д2007 точно был.
|