powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Вызов Start для приостановленного потока
25 сообщений из 47, страница 1 из 2
Вызов Start для приостановленного потока
    #39726220
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наткнулся на непонятки в 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
Вызов Start для приостановленного потока
    #39726256
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокЯ что-то пропустил?
Очень много... Уже и не помню, с какой версии такое поведение.
Даже в 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
Вызов Start для приостановленного потока
    #39726377
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanДаже в fpc пишут
но мне нужно ехать, а не шашечки. :)

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

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

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

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

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

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

зы. иногда желание довести все до "совершенства" рождает трудно читаемый код
...
Рейтинг: 0 / 0
Вызов Start для приостановленного потока
    #39726725
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокА твой совет нарушает принцип бритвы Оккамы :)
Нисколько. Как раз необходимость корректно завершить/остановить поток это необходимость.
Другое дело, что не все так считают. Кто-то и "пожалуйста" не считает нужным говорить.
...
Рейтинг: 0 / 0
Вызов Start для приостановленного потока
    #39726734
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокА твой совет нарушает принцип бритвы Оккамы :)
Вот минимальный поток с доп. функционалом:
Код: 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
Вызов Start для приостановленного потока
    #39726848
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanВот минимальный поток с доп. функционалом
...
Рейтинг: 0 / 0
Вызов Start для приостановленного потока
    #39726852
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
ДокwadmanВот минимальный поток с доп. функционалом



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



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

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

Код: 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
Вызов Start для приостановленного потока
    #39726894
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpwadmanВот минимальный поток с доп. функционалом:

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

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

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


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