В последних версиях компилятора Free Pascal, включая версию 2.6.2, были внесены изменения в конструктор класса TThread, что может вызвать ошибки при компиляции существующего кода. В частности, конструктор Create теперь принимает два параметра, второй из которых является необязательным и отвечает за размер стека. Это изменение привело к тому, что ранее написанный код, в котором использовался конструктор TThread с одним параметром, стал некорректным.
Пример кода, вызывающего ошибку:
program project16416258;
{$mode Delphi}
uses
Classes;
type
TFPCTestThread = class(TThread)
public
constructor Create(CreateSuspended: Boolean);
end;
constructor TFPCTestThread.Create(CreateSuspended: Boolean);
begin
inherited;
end;
begin
end.
При попытке компиляции данного кода пользователи могут столкнуться с ошибкой:
ThroughputTestUnit.pas(82,19) Error: Wrong number of parameters
specified for call to "Create" Hint: Found declaration: constructor
TThread.Create(Boolean,const LongWord="4194304");
Решение проблемы:
Чтобы исправить ошибку, необходимо явно указать параметры для вызова конструктора базового класса TThread. В данном случае, это делается следующим образом:
constructor TFPCTestThread.Create(CreateSuspended: Boolean);
begin
inherited Create(CreateSuspended);
end;
Таким образом, вызов inherited Create(CreateSuspended); явно передает параметр CreateSuspended конструктору базового класса, который теперь ожидает два параметра.
Подтвержденный ответ:
Вызов inherited; без параметров пытается вызвать конструктор базового класса с текущими параметрами текущего метода. Так как базовый класс TThread не имеет конструктора, принимающего один параметр Boolean, это приводит к ошибке. Правильным решением будет явный вызов конструктора базового класса с указанием всех необходимых параметров.
Альтернативный ответ:
Пользователи также могут столкнуться с аналогичной ошибкой при использовании следующего кода:
program project16416258;
{$mode Delphi}
uses
Classes;
type
TFPCTestThread = class(TThread)
public
// Описание класса остается без изменений
end;
// Описание конструктора также остается без изменений
begin
end.
Ошибка будет вызвана изменением в конструкторе TThread, который теперь имеет дополнительный параметр StackSize с установленным значением по умолчанию DefaultStackSize.
Комментарии:
В комментариях к вопросу обсуждается, почему декларация конструктора TThroughputThread.Create компилируется без предупреждений, несмотря на то, что она маскирует метод Create базового класса. Обсуждается также, являются ли конструкторы специальным случаем, не требующим явного указания reintroduce/overload/override.
В заключение, важно всегда следить за изменениями в библиотеках и компиляторах, чтобы своевременно обновлять свой код и избегать ошибок компиляции.
В Free Pascal 2.6.2 произошли изменения в конструкторе класса `TThread`, что потребовало обновления вызовов конструктора для корректной компиляции кода.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.