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

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

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

Дак тут всё https://github.com/wadman/wthread

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

Откуда: Казань
Сообщений: 5840
wadman
Предлагаю взять мою обертку и не париться.

надеюсь, на D2007 взлетит. Спасибо :)
2 ноя 18, 09:24    [21722144]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 24502
Док
wadman
Предлагаю взять мою обертку и не париться.

надеюсь, на D2007 взлетит. Спасибо :)

Летает и на D7 и на 10.x и на маках, убунтах всяких.
2 ноя 18, 09:27    [21722149]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
defecator
Member

Откуда:
Сообщений: 38865
wadman
Док
пропущено...

надеюсь, на D2007 взлетит. Спасибо :)

Летает и на D7 и на 10.x и на маках, убунтах всяких.

хорошо наговнокодил, молодец !
Щаз буду юзать !
2 ноя 18, 09:28    [21722150]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
wadman
Member

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

Летает и на D7 и на 10.x и на маках, убунтах всяких.

хорошо наговнокодил, молодец !
Щаз буду юзать !

2 ноя 18, 09:34    [21722156]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 3479
Док
Наткнулся на непонятки в 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 же), запускает поток корректно. Я что-то пропустил?

я вообще не вижу смысла в твоём коде, делай просто
constructor TMyThread.Create();
begin
  inherited Create(False);
  FreeOnTerminate:= False;
  Priority:= tpLower;
end;
будет то же самое
2 ноя 18, 10:52    [21722248]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
vavan
Member

Откуда: Казань
Сообщений: 3163
defecator
как человек, варивший трубы, скажу, что тут поработал Мастер
+
мне когда на хате ремонт доделали и я уже заезжал, обнаружилось что дурит смеситель с термостатом в ванной, не работает, кипяток льет. выяснилось что монтажники-джамшуты кроме всего прочего и подводку в этом месте перепутали, а есть лишь небольшое ревизионное окошко и думал что придется ломать плитку, не успев заехать. благо спец именно по сантехнике сумел перепаять прям через эту маленькую дверцу
2 ноя 18, 11:55    [21722363]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
ziv-2014
Member

Откуда:
Сообщений: 147
wadman,
Как раз собирался искать :) Спасибо!
2 ноя 18, 14:23    [21722526]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
Док
Member

Откуда: Казань
Сообщений: 5840
kealon(Ruslan)
я вообще не вижу смысла в твоём коде, делай просто
constructor TMyThread.Create();
begin
  inherited Create(False);
  FreeOnTerminate:= False;
  Priority:= tpLower;
end;

будет то же самое

В моём коде это имеет смысл. На, пробуй свои советы на практике :)

К сообщению приложен файл (test.7z - 10Kb) cкачать
2 ноя 18, 14:35    [21722539]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
s62
Member

Откуда: Жуковский
Сообщений: 846
Док
В моём коде это имеет смысл. На, пробуй свои советы на практике :)

Как я понимаю, неважно, создаем мы так
inherited Create(False)

или же так
inherited Create(True)

поток в конструкторе TThread.Create создается приостановленным и стартует (даже если в конструкторе наследника используется inherited Create(False) ) только после выполнения конструктора - в процедуре AfterConstruction. Поэтому все операторы и процедуры в конструкторе класса-наследника в любом случае выполнятся до того, как стартует поток.
Может я ошибаюсь, конечно, но по-моему это так.
2 ноя 18, 15:09    [21722587]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
s62
Member

Откуда: Жуковский
Сообщений: 846
s62,

s62
и стартует (даже если в конструкторе наследника используется inherited Create(False) ) только после выполнения конструктора - в процедуре AfterConstruction

Не даже если, а просто если.
2 ноя 18, 15:26    [21722605]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3621
Док
Наткнулся на непонятки в 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 же), запускает поток корректно. Я что-то пропустил?
Правильно тебя посылает. Скорей всено, Start выполняет запуск потока, который запрещен в конструкторе. Передай False в параметр Suspended - и всё, никаких Resume не надо будет и все будет хорошо.
Suspended нужно для того, чтобы после конструктора но до запуска потока что-то изменить в объекте потока. Не твой случай.
2 ноя 18, 15:51    [21722635]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
YuRock
Member

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

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

Брррр.
Надо хоть так:

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

destructor TMyThread.Destroy;
begin
    Terminate;
    FEvent.SetEvent;
    inherited Destroy;
    FEvent.Free;
end;
2 ноя 18, 15:55    [21722640]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
YuRock
Member

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

А еще желательно в деструкторе проверять на Assigned( FEvent ), если в конструкторе возможны исключения.
2 ноя 18, 15:57    [21722642]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
Док
Member

Откуда: Казань
Сообщений: 5840
YuRock
Скорей всено, Start выполняет запуск потока, который запрещен в конструкторе.

Абсолютно верно. На Tokyo Start разрешен только в основном потоке, а вот в Лазарусе - везде(и в конструкторе, и в основном потоке).

И, теперь вижу, что это правильно: ибо, если создать поток так
    try
      fThread:= TMyThread.Create(True);
      try
        frmSplash:= TfrmSplash.Create(Self);
//        if fThread.Suspended then fThread.Start;
        frmSplash.ShowModal;
      finally
        FreeAndNil(frmSplash);
      end;

      frmChild.ShowModal;
    finally
      FreeAndNil(fThread);
    end;

, но "забыть" стартануть его, то код в основном потоке продолжится дальше без выполнения fThread.Execute. А вот это уже фэйл :)

YuRock
Передай False в параметр Suspended - и всё, никаких Resume не надо будет и все будет хорошо.

Я это делаю намеренно: мне нужно быть точно уверенным, что некоторые переменные будут инициализированы в конструкторе ДО запуска доп.потока
2 ноя 18, 21:58    [21723006]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1164
Вообще не понимаю смысла приостановленных нитей. Они ж нужны чтобы выполнить работу в определенный момент времени. А если надо пауза, то это дело объектов синхронизации.
2 ноя 18, 22:06    [21723011]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
alekcvp
Member

Откуда:
Сообщений: 1142
Док
Я это делаю намеренно: мне нужно быть точно уверенным, что некоторые переменные будут инициализированы в конструкторе ДО запуска доп.потока

Независимо от параметра - ВСЕ переменные будут инициализированы в конструкторе ДО запуска потока.
2 ноя 18, 22:44    [21723041]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
Док
Member

Откуда: Казань
Сообщений: 5840
alekcvp
ВСЕ переменные будут инициализированы в конструкторе ДО запуска потока

это описано в доке или просто твоя уверенность?
2 ноя 18, 23:23    [21723070]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
Док
Member

Откуда: Казань
Сообщений: 5840
Я чуть выше неточно выразился: мне инициализировать некоторые переменные ДО запуска, но не только в конструкторе (например, frmSplash в коде выше).
2 ноя 18, 23:40    [21723088]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3621
Док
alekcvp
ВСЕ переменные будут инициализированы в конструкторе ДО запуска потока

это описано в доке или просто твоя уверенность?
Да, но ищи сам. Главное, это описано в исходниках класса TThread - запуск потока происходит в AfterConatruction.
2 ноя 18, 23:55    [21723098]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3621
Док
Я чуть выше неточно выразился: мне инициализировать некоторые переменные ДО запуска, но не только в конструкторе (например, frmSplash в коде выше).
Тогда да, надо. Но тогда и Start должен сработать.
2 ноя 18, 23:56    [21723100]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
Док
Member

Откуда: Казань
Сообщений: 5840
YuRock
это описано в исходниках класса TThread - запуск потока происходит в AfterConatruction

в справке тоже об этом сказано. По коду, оба метода: и Start, и AfterConstruction вызывают InternalStart, только с разными параметрами. Так что, про "все в конструкторе инициализируется ДО" Execute доп.потока - это я просто сам не догадался :)

Познавательно, однако...
3 ноя 18, 00:49    [21723119]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
Все форумы / Delphi Ответить