![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Странное поведение Delphi 2009
EgorovAlex © (2009-03-11 10:33:00)Есть такой код:
В нём выскакивает исключение, когда выполняется процедура 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;
EgorovAlex (2009-03-11 10:56:00) [1]> Synchronize(procedure of self begin
> ProcTest(S);
> end);
Нет, так нельзя
EgorovAlex (2009-03-11 10:54:00) [2]Так в 2009 Synchronize переписан, от теперь и регулярные процедуры может принимать, вопрос только как качественно это сделали.
У кого есть логин на CDN - можете запостить этот баг?
Palladin (2009-03-11 10:53:00) [3]а вот так нельзя написать?
Synchronize(procedure of self begin
ProcTest(S);
end);
:)
Palladin (2009-03-11 10:50:00) [4]
> EgorovAlex © (11.03.09 10:47) [4]
Synchronize принимает метод, а вот как ведет себя компилятор при анонимной процедуре, я фих знает, может он ее компилирует как регулярную... так что да... похоже это недочет аффторов
EgorovAlex (2009-03-11 10:47:00) [5]Да, если работать по-старому, без анонимных процедур, то проблем нет :( это похоже их баг :(
EgorovAlex (2009-03-11 10:45:00) [6]Прошу прощения за дезинформацию- если код синхронизации закомментить, то исключения не возникает!
EgorovAlex (2009-03-11 10:43:00) [7]Так даже если закомментировать этот код, исключение всё-равно будет, а приведённый код синхронизации рекомендуется кодегировцами, как рабочий :)
Palladin (2009-03-11 10:40:00) [8]А в предыдущих версиях делфи не было анонимных процедур :), в связи с этим, вызов
Synchronize(procedure begin ProcTest(S); end)
мне кажется очень сомнительным