Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Странное поведение 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)

мне кажется очень сомнительным


Наверх

Титульная страница Поиск, карта сайта Написать письмо