Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.01.2013, 17:58   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию TThread. Почему нельзя выполнить start в конструкторе класса а resume можно?

Доброго времени суток!

Имеется код:
Код:
constructor TmyThread.Create;
begin
inhreited Create(True); //Create suspended

Start;  // 
end;
После вызова start будет ошибка.

Данным методом Thread обзавелся в новых версиях delphi и выглядит он вот так:
Код:
procedure TThread.Start;
begin
  InternalStart(False);
end;

procedure TThread.InternalStart(Force: Boolean);
begin
  if (FCreateSuspended or Force) and not FFinished and not FExternalThread then
  begin
    FSuspended := False;
    FCreateSuspended := False;
    if ResumeThread(FHandle) <> 1 then
      raise EThread.Create(SThreadStartError);
  end else
    raise EThread.Create(SThreadStartError);
end;
а вот если переделать конструктор вот так:
Код:
constructor TmyThread.Create;
begin
inhreited Create(True); //Create suspended

Resume;  // 
end;
то все нормально.

Вопрос:
Это прикол такой в методе start и в случае успеха и в случае провала - выдавать ошибку?

НО и тут все хитро:
Если вызвать start за пределами конструктора(ну пускай это делает владелец), то все нормально. Созданный поток в приостановленном состоянии продолжает работать.

Возникает завидный парадокс,
Поток создан приостановленным, почему именно в конструкторе класса ResumeThread возвращает значение <> 1, а вне = 1.

Как это может быть и почему оно происходит?

Последний раз редактировалось Человек_Борща; 09.01.2013 в 18:01.
Человек_Борща вне форума Ответить с цитированием
Старый 09.01.2013, 19:44   #2
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Предохраняются. Там пометка есть, мол вредно из самого потока себя же запускать/тормозить, т.к. если этот кусок в блоке синхронизации, то он может второе пришествие ожидать если не уследили. При огромных программах такое может и случится, но в мелких масштабах это легко видится.
eoln вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему нельзя повернуть колонтитул? palladin90 Microsoft Office Word 1 17.06.2012 23:23
Динамическое Выделение Памяти В Конструкторе Класса D-Vampire Общие вопросы C/C++ 5 20.12.2011 00:34
Объект одного класса в конструкторе другого Benderbej PHP 5 13.02.2011 22:48
Почему из метода класса нельзя обратиться к компоненту на форме? Дима я Общие вопросы Delphi 2 28.03.2010 13:21
Метод Synchronize класса TThread EdNovice Общие вопросы Delphi 10 01.08.2009 14:47