Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Вызов Start для приостановленного потока / 25 сообщений из 47, страница 1 из 2
01.11.2018, 01:44
    #39726220
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов Start для приостановленного потока
Наткнулся на непонятки в DX10.2.3_CE: если создать доп.поток приостановленным, например так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
constructor TMyThread.Create(CreateSuspended: Boolean);
begin
  inherited Create(CreateSuspended);
  FreeOnTerminate:= False;
  Priority:= tpLower;

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


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

Код: pascal
1.
Cannot call Start on a running or suspended thread.



Старый добрый Resume, показываемый в Code Insight серым цветом (deprecated же), запускает поток корректно. Я что-то пропустил?
...
Рейтинг: 0 / 0
01.11.2018, 07:46
    #39726256
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов Start для приостановленного потока
ДокЯ что-то пропустил?
Очень много... Уже и не помню, с какой версии такое поведение.
Даже в fpc пишут:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
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;  
...
Рейтинг: 0 / 0
01.11.2018, 10:41
    #39726377
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов Start для приостановленного потока
wadmanДаже в fpc пишут
но мне нужно ехать, а не шашечки. :)

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

зы. на Лазаре применение Resume/Start нареканий не вызывает (кроме пресловутого предупреждения о deprecated). А вот на последних дельфях ...
...
Рейтинг: 0 / 0
01.11.2018, 11:05
    #39726395
zinpub
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов Start для приостановленного потока
Док,

Кошерно - через TEvent...
...
Рейтинг: 0 / 0
01.11.2018, 11:20
    #39726404
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов Start для приостановленного потока
ДокИли есть более кошерный, но работающий способ?
Уже написали. У меня аналогично: поток стартует, готовит очередь и засыпает.
...
Рейтинг: 0 / 0
01.11.2018, 12:55
    #39726494
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов Start для приостановленного потока
zinpubКошерно - через TEvent...
ага, знаю я вас. Сначала эвенты, потом мютексы, семафоры, критические функции и проч.проч.

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

зы. Рустам, перенеси, плз, относящиеся к теме посты в отдельную ветку. Думал, только спросить, а тут "вон оно, чо" ©
...
Рейтинг: 0 / 0
01.11.2018, 13:08
    #39726508
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов Start для приостановленного потока
wadmanУже написали.
т.е. приостановленный поток топорным способом не запустить, а только через SetEvent?
...
Рейтинг: 0 / 0
01.11.2018, 13:30
    #39726532
zinpub
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов Start для приостановленного потока
Док,

Зато наглядно, в случае suspend/resume - не угадаешь - где остановился поток.
...
Рейтинг: 0 / 0
01.11.2018, 14:11
    #39726572
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов Start для приостановленного потока
ДокwadmanУже написали.
т.е. приостановленный поток топорным способом не запустить, а только через SetEvent?
Топорным способом - это не кашерно и не предсказуемо.
...
Рейтинг: 0 / 0
01.11.2018, 16:15
    #39726702
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов Start для приостановленного потока
wadmanТопорным способом - это не кашерно и не предсказуемо.
у меня поток выполняет одноразовую работу. А твой совет нарушает принцип бритвы Оккамы :)

зы. иногда желание довести все до "совершенства" рождает трудно читаемый код
...
Рейтинг: 0 / 0
01.11.2018, 16:34
    #39726725
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов Start для приостановленного потока
ДокА твой совет нарушает принцип бритвы Оккамы :)
Нисколько. Как раз необходимость корректно завершить/остановить поток это необходимость.
Другое дело, что не все так считают. Кто-то и "пожалуйста" не считает нужным говорить.
...
Рейтинг: 0 / 0
01.11.2018, 16:51
    #39726734
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов Start для приостановленного потока
ДокА твой совет нарушает принцип бритвы Оккамы :)
Вот минимальный поток с доп. функционалом:
Код: 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.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
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.

...
Рейтинг: 0 / 0
01.11.2018, 21:11
    #39726848
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов Start для приостановленного потока
wadmanВот минимальный поток с доп. функционалом
...
Рейтинг: 0 / 0
01.11.2018, 21:28
    #39726852
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов Start для приостановленного потока
ДокwadmanВот минимальный поток с доп. функционалом



как человек, варивший трубы, скажу, что тут поработал Мастер
...
Рейтинг: 0 / 0
01.11.2018, 22:00
    #39726866
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов Start для приостановленного потока
defecatorтут поработал Мастер
это кто-то оспаривает? ;)
...
Рейтинг: 0 / 0
01.11.2018, 22:39
    #39726887
Dmitry Arefiev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов Start для приостановленного потока
Докэто кто-то оспаривает? ;)
Руки мастера, мозг ... Но тут надо историю знать :)
...
Рейтинг: 0 / 0
01.11.2018, 22:43
    #39726888
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов Start для приостановленного потока
ДокwadmanВот минимальный поток с доп. функционалом



Все будет проще, если код потока отделишь от формы. :)
...
Рейтинг: 0 / 0
01.11.2018, 22:53
    #39726892
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов Start для приостановленного потока
wadmanВот минимальный поток с доп. функционалом:

А почему Sleep(100), а не 146, например?
...
Рейтинг: 0 / 0
01.11.2018, 22:58
    #39726893
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов Start для приостановленного потока
Это я к тому, что:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
  ...
  while (FEvent.WaitFor(INFINITE) = wrSignaled) and not Terminated do begin
  ...

destructor TMyThread.Destroy;
begin
  FEvent.Free;
  inherited Destroy;
end;
...
Рейтинг: 0 / 0
01.11.2018, 22:58
    #39726894
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов Start для приостановленного потока
alekcvpwadmanВот минимальный поток с доп. функционалом:

А почему Sleep(100), а не 146, например?
Пусть будет 146. Не проблема.
...
Рейтинг: 0 / 0
02.11.2018, 00:22
    #39726903
Gator
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов Start для приостановленного потока
wadmanВсе будет проще, если код потока отделишь от формы. :)А я всегда говорил, что форма (контролы) это витринка.
Процессору (мозгу) интересен ассемблер.

Иллюстрация у магазина:
- Экспозиция в витрине
- Вывеска
-- тупо нарисовано на картонке
-- железную конструкцию (типа железный сапог на цепях) ветер качает
...
...
Рейтинг: 0 / 0
02.11.2018, 08:44
    #39726938
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов Start для приостановленного потока
wadmanВсе будет проще, если код потока отделишь от формы. :)
мой код, написанный 10 лет назад, теперь у меня вызывает бурю негативных эмоций. А ты предлагаешь еще "отделять бизнес слой от ГУИ-шного" ©
[spoiler][youtube=
YouTube Video
...
Рейтинг: 0 / 0
02.11.2018, 08:51
    #39726943
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов Start для приостановленного потока
ДокА ты предлагаешь еще "отделять бизнес слой от ГУИ-шного" ©
Предлагаю взять мою обертку и не париться. вместо батона кинул поток на форму, завел пару тасков и их обработчиков и всё!
...
Рейтинг: 0 / 0
02.11.2018, 09:01
    #39726947
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов Start для приостановленного потока
wadmanДокА ты предлагаешь еще "отделять бизнес слой от ГУИ-шного" ©
Предлагаю взять мою обертку и не париться. вместо батона кинул поток на форму, завел пару тасков и их обработчиков и всё!
давай обёртку, мне надо
...
Рейтинг: 0 / 0
02.11.2018, 09:10
    #39726951
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов Start для приостановленного потока
defecatorwadmanпропущено...

Предлагаю взять мою обертку и не париться. вместо батона кинул поток на форму, завел пару тасков и их обработчиков и всё!
давай обёртку, мне надо
Дак тут всё https://github.com/wadman/wthread
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Вызов Start для приостановленного потока / 25 сообщений из 47, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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