Конференция "Прочее" » Как жить дальше?
 
  • DVM © (25.03.16 17:00) [28]

    > NoUser ©   (25.03.16 14:48) [27]


    > А чего тогда требует?

    OnTerminate через  Synchronize вызывается. Теперешний Synchronize уже не использует сообщений как раньше. Подробности см. реализацию Synchronize
  • DVM © (25.03.16 17:00) [28]

    > NoUser ©   (25.03.16 14:48) [27]


    > А чего тогда требует?

    OnTerminate через  Synchronize вызывается. Теперешний Synchronize уже не использует сообщений как раньше. Подробности см. реализацию Synchronize
  • DVM © (25.03.16 17:00) [28]

    > NoUser ©   (25.03.16 14:48) [27]


    > А чего тогда требует?

    OnTerminate через  Synchronize вызывается. Теперешний Synchronize уже не использует сообщений как раньше. Подробности см. реализацию Synchronize
  • NoUser © (25.03.16 17:50) [29]
    Вот мне и интересно, как сделать основной поток (без окон), чтобы этот OnTerminate там отработал?
  • NoUser © (25.03.16 17:50) [29]
    Вот мне и интересно, как сделать основной поток (без окон), чтобы этот OnTerminate там отработал?
  • NoUser © (25.03.16 17:50) [29]
    Вот мне и интересно, как сделать основной поток (без окон), чтобы этот OnTerminate там отработал?
  • DVM © (25.03.16 18:17) [30]

    > Вот мне и интересно, как сделать основной поток (без окон),
    >  чтобы этот OnTerminate там отработал?


    program Project1;

    {$APPTYPE CONSOLE}

    {$R *.res}

    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;

    { 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;

    { TMyThread }

    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.

  • DVM © (25.03.16 18:17) [30]

    > Вот мне и интересно, как сделать основной поток (без окон),
    >  чтобы этот OnTerminate там отработал?


    program Project1;

    {$APPTYPE CONSOLE}

    {$R *.res}

    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;

    { 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;

    { TMyThread }

    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.

  • DVM © (25.03.16 18:17) [30]

    > Вот мне и интересно, как сделать основной поток (без окон),
    >  чтобы этот OnTerminate там отработал?


    program Project1;

    {$APPTYPE CONSOLE}

    {$R *.res}

    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;

    { 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;

    { TMyThread }

    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.

  • DVM © (25.03.16 18:20) [31]
    Небольшое уточнение, надо убрать FSecondThread.FreeOnTerminate := True;
  • DVM © (25.03.16 18:20) [31]
    Небольшое уточнение, надо убрать FSecondThread.FreeOnTerminate := True;
  • DVM © (25.03.16 18:20) [31]
    Небольшое уточнение, надо убрать FSecondThread.FreeOnTerminate := True;
  • NoUser © (25.03.16 19:07) [32]
    Спасибо, но как я и думал, чуда не произошло - CheckSynchronize.
    ЗЫ.
    А какая версия Dx ?
  • NoUser © (25.03.16 19:07) [32]
    Спасибо, но как я и думал, чуда не произошло - CheckSynchronize.
    ЗЫ.
    А какая версия Dx ?
  • NoUser © (25.03.16 19:07) [32]
    Спасибо, но как я и думал, чуда не произошло - CheckSynchronize.
    ЗЫ.
    А какая версия Dx ?
  • DVM © (25.03.16 21:46) [33]

    > NoUser ©   (25.03.16 19:07) [32]


    > чуда не произошло - CheckSynchronize.

    Разумеется, чуда никакого нет и не может быть. Никто, кроме самого потока не может выполнить код в его контексте. Собственно внутри CheckSynchronize и происходит выборка из очереди действия для выполнения потоком и собственно выполнение.


    > А какая версия Dx ?
    >
    >

    У меня D8. Но CheckSynchronize  существует очень давно, в 2009 уже было вроде, а может и раньше.
  • DVM © (25.03.16 21:46) [33]

    > NoUser ©   (25.03.16 19:07) [32]


    > чуда не произошло - CheckSynchronize.

    Разумеется, чуда никакого нет и не может быть. Никто, кроме самого потока не может выполнить код в его контексте. Собственно внутри CheckSynchronize и происходит выборка из очереди действия для выполнения потоком и собственно выполнение.


    > А какая версия Dx ?
    >
    >

    У меня D8. Но CheckSynchronize  существует очень давно, в 2009 уже было вроде, а может и раньше.
  • DVM © (25.03.16 21:46) [33]

    > NoUser ©   (25.03.16 19:07) [32]


    > чуда не произошло - CheckSynchronize.

    Разумеется, чуда никакого нет и не может быть. Никто, кроме самого потока не может выполнить код в его контексте. Собственно внутри CheckSynchronize и происходит выборка из очереди действия для выполнения потоком и собственно выполнение.


    > А какая версия Dx ?
    >
    >

    У меня D8. Но CheckSynchronize  существует очень давно, в 2009 уже было вроде, а может и раньше.
  • Германн © (25.03.16 23:05) [34]
    Раньше. В Д2007 точно был.
  • Германн © (25.03.16 23:05) [34]
    Раньше. В Д2007 точно был.
 
Конференция "Прочее" » Как жить дальше?
Есть новые Нет новых   [134434   +27][b:0][p:0.003]