Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Вызов Start для приостановленного потока  [new]
Док
Member

Откуда: Казань
Сообщений: 5840
Наткнулся на непонятки в DX10.2.3_CE: если создать доп.поток приостановленным, например так:
constructor TMyThread.Create(CreateSuspended: Boolean);
begin
  inherited Create(CreateSuspended);
  FreeOnTerminate:= False;
  Priority:= tpLower;

  if Suspended then Start;
//  if Suspended then Resume;
end;

а затем запустить рекомендуемой процедурой Start, то получаем отлуп

Cannot call Start on a running or suspended thread.


Старый добрый Resume, показываемый в Code Insight серым цветом (deprecated же), запускает поток корректно. Я что-то пропустил?
1 ноя 18, 01:44    [21720983]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 24502
Док
Я что-то пропустил?

Очень много... Уже и не помню, с какой версии такое поведение.
Даже в fpc пишут:
procedure TThread.Start;
begin
  { suspend/resume are now deprecated in Delphi (they also don't work
    on most platforms in FPC), so a different method was required
    to start a thread if it's create with fSuspended=true -> that's
    what this method is for. }
  Resume;
end;  
1 ноя 18, 07:46    [21721026]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
Док
Member

Откуда: Казань
Сообщений: 5840
wadman
Даже в fpc пишут

но мне нужно ехать, а не шашечки. :)

Как быть? По-прежнему запускать посредством Resume? Или есть более кошерный, но работающий способ?

зы. на Лазаре применение Resume/Start нареканий не вызывает (кроме пресловутого предупреждения о deprecated). А вот на последних дельфях ...
1 ноя 18, 10:41    [21721192]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
zinpub
Member

Откуда:
Сообщений: 273
Док,

Кошерно - через TEvent...
1 ноя 18, 11:05    [21721218]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 24502
Док
Или есть более кошерный, но работающий способ?

Уже написали. У меня аналогично: поток стартует, готовит очередь и засыпает.
1 ноя 18, 11:20    [21721236]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
Док
Member

Откуда: Казань
Сообщений: 5840
zinpub
Кошерно - через TEvent...

ага, знаю я вас. Сначала эвенты, потом мютексы, семафоры, критические функции и проч.проч.

Нафик, допилю 10-летней давности проект на D2007 и уйду на Лазарь :)

зы. Рустам, перенеси, плз, относящиеся к теме посты в отдельную ветку. Думал, только спросить, а тут "вон оно, чо" ©
1 ноя 18, 12:55    [21721399]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
Док
Member

Откуда: Казань
Сообщений: 5840
wadman
Уже написали.

т.е. приостановленный поток топорным способом не запустить, а только через SetEvent?
1 ноя 18, 13:08    [21721427]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
zinpub
Member

Откуда:
Сообщений: 273
Док,

Зато наглядно, в случае suspend/resume - не угадаешь - где остановился поток.
1 ноя 18, 13:30    [21721466]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 24502
Док
wadman
Уже написали.

т.е. приостановленный поток топорным способом не запустить, а только через SetEvent?

Топорным способом - это не кашерно и не предсказуемо.
1 ноя 18, 14:11    [21721521]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
Док
Member

Откуда: Казань
Сообщений: 5840
wadman
Топорным способом - это не кашерно и не предсказуемо.

у меня поток выполняет одноразовую работу. А твой совет нарушает принцип бритвы Оккамы :)

зы. иногда желание довести все до "совершенства" рождает трудно читаемый код
1 ноя 18, 16:15    [21721725]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 24502
Док
А твой совет нарушает принцип бритвы Оккамы :)

Нисколько. Как раз необходимость корректно завершить/остановить поток это необходимость.
Другое дело, что не все так считают. Кто-то и "пожалуйста" не считает нужным говорить.
1 ноя 18, 16:34    [21721753]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 24502
Док
А твой совет нарушает принцип бритвы Оккамы :)

Вот минимальный поток с доп. функционалом:
+
unit Unit2;

{$mode objfpc}{$H+}

interface

uses
    Classes, SysUtils, Forms, Controls, Graphics, Dialogs, syncobjs, Windows;

const
    WM_USER = 1024;

type

    { TMyThread }

    TMyThread = class(TThread)
    private
        FEvent: TEvent;
        FOwner: TForm;
        FSomePar: integer;
    protected
        procedure Execute; override;
    public
        procedure AfterConstruction; override;
        destructor Destroy; override;
        property Owner: TForm read FOwner write FOwner;
        property SomePar: integer read FSomePar write FSomePar;
        property Event: TEvent read FEvent;
    end;

type

    { TForm2 }

    TForm2 = class(TForm)
        procedure FormCreate(Sender: TObject);
    private
        procedure WMTest(var Msg: TMessage); message WM_USER+1;
    public

    end;

var
    Form2: TForm2;

implementation

{$R *.lfm}

{ TForm2 }

procedure TForm2.FormCreate(Sender: TObject);
var t: TMyThread;
begin
    t := TMyThread.Create(false);
    t.Owner := Self;
    t.SomePar := 10;
    t.Event.SetEvent;
end;

procedure TForm2.WMTest(var Msg: TMessage);
begin
    // тут нам что-то сообщили
    Caption := 'Final!';
end;

{ TMyThread }

procedure TMyThread.Execute;
begin
    while not Terminated do begin
        if not Terminated then FEvent.WaitFor(INFINITE);
        if not Terminated then begin
            if SomePar = 10 then begin
                // тут работу работуем
                Sleep(1000);
                if Assigned(FOwner) then PostMessage(FOwner.Handle, WM_USER+1, 0, 0);
            end;
        end;
    end;
end;

procedure TMyThread.AfterConstruction;
begin
    inherited AfterConstruction;
    FEvent := TEvent.Create(nil, false, false, 'MyEvent');
end;

destructor TMyThread.Destroy;
begin
    Terminate;
    FEvent.SetEvent;
    Sleep(100);
    FEvent.Free;
    inherited Destroy;
end;

end.
1 ноя 18, 16:51    [21721765]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
Док
Member

Откуда: Казань
Сообщений: 5840
wadman
Вот минимальный поток с доп. функционалом



К сообщению приложен файл. Размер - 81Kb
1 ноя 18, 21:11    [21721953]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
defecator
Member

Откуда:
Сообщений: 38865
Док
wadman
Вот минимальный поток с доп. функционалом



Картинка с другого сайта.

как человек, варивший трубы, скажу, что тут поработал Мастер
1 ноя 18, 21:28    [21721963]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
Док
Member

Откуда: Казань
Сообщений: 5840
defecator
тут поработал Мастер

это кто-то оспаривает? ;)
1 ноя 18, 22:00    [21721987]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
Dmitry Arefiev
Member

Откуда:
Сообщений: 9647
Док
это кто-то оспаривает? ;)

Руки мастера, мозг ... Но тут надо историю знать :)
1 ноя 18, 22:39    [21722011]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 24502
Док
wadman
Вот минимальный поток с доп. функционалом



Картинка с другого сайта.

Все будет проще, если код потока отделишь от формы. :)
1 ноя 18, 22:43    [21722013]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
alekcvp
Member

Откуда:
Сообщений: 1142
wadman
Вот минимальный поток с доп. функционалом:

А почему Sleep(100), а не 146, например?
1 ноя 18, 22:53    [21722019]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
alekcvp
Member

Откуда:
Сообщений: 1142
Это я к тому, что:

  ...
  while (FEvent.WaitFor(INFINITE) = wrSignaled) and not Terminated do begin
  ...

destructor TMyThread.Destroy;
begin
  FEvent.Free;
  inherited Destroy;
end;
1 ноя 18, 22:58    [21722020]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 24502
alekcvp
wadman
Вот минимальный поток с доп. функционалом:

А почему Sleep(100), а не 146, например?

Пусть будет 146. Не проблема.
1 ноя 18, 22:58    [21722022]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
Gator
Member

Откуда: Москва
Сообщений: 13910
wadman
Все будет проще, если код потока отделишь от формы. :)
А я всегда говорил, что форма (контролы) это витринка.
Процессору (мозгу) интересен ассемблер.

Иллюстрация у магазина:
- Экспозиция в витрине
- Вывеска
-- тупо нарисовано на картонке
-- железную конструкцию (типа железный сапог на цепях) ветер качает
...
2 ноя 18, 00:22    [21722048]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
Док
Member

Откуда: Казань
Сообщений: 5840
wadman
Все будет проще, если код потока отделишь от формы. :)

мой код, написанный 10 лет назад, теперь у меня вызывает бурю негативных эмоций. А ты предлагаешь еще "отделять бизнес слой от ГУИ-шного" ©
+
[youtube=
Ссылка на позицию в клипе: http://youtu.be/ZZjLzZZZE38?t=59
]
2 ноя 18, 08:44    [21722108]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 24502
Док
А ты предлагаешь еще "отделять бизнес слой от ГУИ-шного" ©

Предлагаю взять мою обертку и не париться. вместо батона кинул поток на форму, завел пару тасков и их обработчиков и всё!
2 ноя 18, 08:51    [21722114]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
defecator
Member

Откуда:
Сообщений: 38865
wadman
Док
А ты предлагаешь еще "отделять бизнес слой от ГУИ-шного" ©

Предлагаю взять мою обертку и не париться. вместо батона кинул поток на форму, завел пару тасков и их обработчиков и всё!

давай обёртку, мне надо
2 ноя 18, 09:01    [21722120]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 24502
defecator
wadman
пропущено...

Предлагаю взять мою обертку и не париться. вместо батона кинул поток на форму, завел пару тасков и их обработчиков и всё!

давай обёртку, мне надо

Дак тут всё https://github.com/wadman/wthread
2 ноя 18, 09:10    [21722124]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Delphi Ответить