powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Вызов Start для приостановленного потока
22 сообщений из 47, страница 2 из 2
Вызов Start для приостановленного потока
    #39726962
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
wadmandefecatorпропущено...

давай обёртку, мне надо
Дак тут всё https://github.com/wadman/wthread
я забыл, где оно паслось
...
Рейтинг: 0 / 0
Вызов Start для приостановленного потока
    #39726965
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanПредлагаю взять мою обертку и не париться.
надеюсь, на D2007 взлетит. Спасибо :)
...
Рейтинг: 0 / 0
Вызов Start для приостановленного потока
    #39726970
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокwadmanПредлагаю взять мою обертку и не париться.
надеюсь, на D2007 взлетит. Спасибо :)
Летает и на D7 и на 10.x и на маках, убунтах всяких.
...
Рейтинг: 0 / 0
Вызов Start для приостановленного потока
    #39726971
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
wadmanДокпропущено...

надеюсь, на D2007 взлетит. Спасибо :)
Летает и на D7 и на 10.x и на маках, убунтах всяких.
хорошо наговнокодил, молодец !
Щаз буду юзать !
...
Рейтинг: 0 / 0
Вызов Start для приостановленного потока
    #39726976
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defecatorwadmanпропущено...

Летает и на D7 и на 10.x и на маках, убунтах всяких.
хорошо наговнокодил, молодец !
Щаз буду юзать !
...
Рейтинг: 0 / 0
Вызов Start для приостановленного потока
    #39727047
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокНаткнулся на непонятки в 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 же), запускает поток корректно. Я что-то пропустил?
я вообще не вижу смысла в твоём коде, делай просто
Код: pascal
1.
2.
3.
4.
5.
6.
constructor TMyThread.Create();
begin
  inherited Create(False);
  FreeOnTerminate:= False;
  Priority:= tpLower;
end;

будет то же самое
...
Рейтинг: 0 / 0
Вызов Start для приостановленного потока
    #39727133
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defecatorкак человек, варивший трубы, скажу, что тут поработал Мастер
мне когда на хате ремонт доделали и я уже заезжал, обнаружилось что дурит смеситель с термостатом в ванной, не работает, кипяток льет. выяснилось что монтажники-джамшуты кроме всего прочего и подводку в этом месте перепутали, а есть лишь небольшое ревизионное окошко и думал что придется ломать плитку, не успев заехать. благо спец именно по сантехнике сумел перепаять прям через эту маленькую дверцу
...
Рейтинг: 0 / 0
Вызов Start для приостановленного потока
    #39727231
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,
Как раз собирался искать :) Спасибо!
...
Рейтинг: 0 / 0
Вызов Start для приостановленного потока
    #39727237
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)я вообще не вижу смысла в твоём коде, делай просто
Код: pascal
1.
2.
3.
4.
5.
6.
constructor TMyThread.Create();
begin
  inherited Create(False);
  FreeOnTerminate:= False;
  Priority:= tpLower;
end;


будет то же самое
В моём коде это имеет смысл. На, пробуй свои советы на практике :)
...
Рейтинг: 0 / 0
Вызов Start для приостановленного потока
    #39727262
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док В моём коде это имеет смысл. На, пробуй свои советы на практике :)

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


или же так
Код: pascal
1.
inherited Create(True)


поток в конструкторе TThread.Create создается приостановленным и стартует (даже если в конструкторе наследника используется inherited Create(False) ) только после выполнения конструктора - в процедуре AfterConstruction. Поэтому все операторы и процедуры в конструкторе класса-наследника в любом случае выполнятся до того, как стартует поток.
Может я ошибаюсь, конечно, но по-моему это так.
...
Рейтинг: 0 / 0
Вызов Start для приостановленного потока
    #39727275
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s62,

s62 и стартует (даже если в конструкторе наследника используется inherited Create(False) ) только после выполнения конструктора - в процедуре AfterConstruction
Не даже если, а просто если.
...
Рейтинг: 0 / 0
Вызов Start для приостановленного потока
    #39727294
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокНаткнулся на непонятки в 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 же), запускает поток корректно. Я что-то пропустил?Правильно тебя посылает. Скорей всено, Start выполняет запуск потока, который запрещен в конструкторе. Передай False в параметр Suspended - и всё, никаких Resume не надо будет и все будет хорошо.
Suspended нужно для того, чтобы после конструктора но до запуска потока что-то изменить в объекте потока. Не твой случай.
...
Рейтинг: 0 / 0
Вызов Start для приостановленного потока
    #39727299
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanВот минимальный поток с доп. функционалом
wadman
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
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;


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

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
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;
...
Рейтинг: 0 / 0
Вызов Start для приостановленного потока
    #39727300
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock,

А еще желательно в деструкторе проверять на Assigned( FEvent ), если в конструкторе возможны исключения.
...
Рейтинг: 0 / 0
Вызов Start для приостановленного потока
    #39727444
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockСкорей всено, Start выполняет запуск потока, который запрещен в конструкторе.
Абсолютно верно. На Tokyo Start разрешен только в основном потоке, а вот в Лазарусе - везде(и в конструкторе, и в основном потоке).

И, теперь вижу, что это правильно: ибо, если создать поток так
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
    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 не надо будет и все будет хорошо.
Я это делаю намеренно: мне нужно быть точно уверенным, что некоторые переменные будут инициализированы в конструкторе ДО запуска доп.потока
...
Рейтинг: 0 / 0
Вызов Start для приостановленного потока
    #39727446
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще не понимаю смысла приостановленных нитей. Они ж нужны чтобы выполнить работу в определенный момент времени. А если надо пауза, то это дело объектов синхронизации.
...
Рейтинг: 0 / 0
Вызов Start для приостановленного потока
    #39727453
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокЯ это делаю намеренно: мне нужно быть точно уверенным, что некоторые переменные будут инициализированы в конструкторе ДО запуска доп.потока
Независимо от параметра - ВСЕ переменные будут инициализированы в конструкторе ДО запуска потока.
...
Рейтинг: 0 / 0
Вызов Start для приостановленного потока
    #39727468
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpВСЕ переменные будут инициализированы в конструкторе ДО запуска потока
это описано в доке или просто твоя уверенность?
...
Рейтинг: 0 / 0
Вызов Start для приостановленного потока
    #39727476
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я чуть выше неточно выразился: мне инициализировать некоторые переменные ДО запуска, но не только в конструкторе (например, frmSplash в коде выше).
...
Рейтинг: 0 / 0
Вызов Start для приостановленного потока
    #39727479
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокalekcvpВСЕ переменные будут инициализированы в конструкторе ДО запуска потока
это описано в доке или просто твоя уверенность?Да, но ищи сам. Главное, это описано в исходниках класса TThread - запуск потока происходит в AfterConatruction.
...
Рейтинг: 0 / 0
Вызов Start для приостановленного потока
    #39727480
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокЯ чуть выше неточно выразился: мне инициализировать некоторые переменные ДО запуска, но не только в конструкторе (например, frmSplash в коде выше).Тогда да, надо. Но тогда и Start должен сработать.
...
Рейтинг: 0 / 0
Вызов Start для приостановленного потока
    #39727484
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockэто описано в исходниках класса TThread - запуск потока происходит в AfterConatruction
в справке тоже об этом сказано. По коду, оба метода: и Start, и AfterConstruction вызывают InternalStart, только с разными параметрами. Так что, про "все в конструкторе инициализируется ДО" Execute доп.потока - это я просто сам не догадался :)

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


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