Форум: "Основная";
Текущий архив: 2010.02.07;
Скачать: [xml.tar.bz2];
ВнизСтранное поведение Delphi 2009 Найти похожие ветки
← →
EgorovAlex © (2009-03-11 10:33) [0]Есть такой код:
В нём выскакивает исключение, когда выполняется процедура SetStr, почему оно возникает? В предыдущих версиях дельфы такого не наблюдал:
type
TProcTest = procedure(const TestStr: string) of object;
TTestThread = class(TThread)
private
ProcTest: TProcTest;
protected
procedure Execute; override;
end;
procedure TTestThread.Execute;
var
S: string;
procedure SetStr(I: Integer);
begin
S := "Ok " + IntToStr(I); // вод здесь в строку данные не попадают!
end;
var
I: Integer;
begin
for I := 0 to 9 do begin
SetStr(I);
Synchronize(procedure begin
ProcTest(S);
end);
end;
end;
procedure TForm2.Button1Click(Sender: TObject);
begin
with TTestThread.Create(True) do begin
ProcTest := Self.ProcTest;
FreeOnTerminate := True;
Resume;
end;
end;
procedure TForm2.ProcTest(const TestStr: string);
begin
Memo1.Lines.Add(TestStr);
end;
← →
Palladin © (2009-03-11 10:40) [1]А в предыдущих версиях делфи не было анонимных процедур :), в связи с этим, вызов
Synchronize(procedure begin ProcTest(S); end)
мне кажется очень сомнительным
← →
EgorovAlex © (2009-03-11 10:43) [2]Так даже если закомментировать этот код, исключение всё-равно будет, а приведённый код синхронизации рекомендуется кодегировцами, как рабочий :)
← →
EgorovAlex © (2009-03-11 10:45) [3]Прошу прощения за дезинформацию- если код синхронизации закомментить, то исключения не возникает!
← →
EgorovAlex © (2009-03-11 10:47) [4]Да, если работать по-старому, без анонимных процедур, то проблем нет :( это похоже их баг :(
← →
Palladin © (2009-03-11 10:50) [5]
> EgorovAlex © (11.03.09 10:47) [4]
Synchronize принимает метод, а вот как ведет себя компилятор при анонимной процедуре, я фих знает, может он ее компилирует как регулярную... так что да... похоже это недочет аффторов
← →
Palladin © (2009-03-11 10:53) [6]а вот так нельзя написать?
Synchronize(procedure of self begin
ProcTest(S);
end);
:)
← →
EgorovAlex © (2009-03-11 10:54) [7]Так в 2009 Synchronize переписан, от теперь и регулярные процедуры может принимать, вопрос только как качественно это сделали.
У кого есть логин на CDN - можете запостить этот баг?
← →
EgorovAlex © (2009-03-11 10:56) [8]> Synchronize(procedure of self begin
> ProcTest(S);
> end);
Нет, так нельзя
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2010.02.07;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.004 c