Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.02.07;
Скачать: CL | DM;

Вниз

Странное поведение 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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.009 c
15-1259875013
AlexDan
2009-12-04 00:16
2010.02.07
Стиль W7 и стандартные компоненты..


15-1259224145
brother
2009-11-26 11:29
2010.02.07
регистрация в домене .РФ


15-1259705429
Германн
2009-12-02 01:10
2010.02.07
Или у меня глюки, или что-то изменилось.


4-1228651381
Fildy
2008-12-07 15:03
2010.02.07
определение родильского PID


6-1204447263
IntruderLab
2008-03-02 11:41
2010.02.07
TICQClient