Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2015.09.10;
Скачать: [xml.tar.bz2];

Вниз

У кого есть Delphi > XE4, проверьте багу   Найти похожие ветки 

 
jack128 ©   (2014-11-17 15:51) [0]

У вас при закрытии программы вылазит, что нить типа такого:

---------------------------
Unexpected Memory Leak
---------------------------
An unexpected memory leak has occurred. The unexpected small block leaks are:

21 - 28 bytes: RunTest$1602398$ActRec x 1

---------------------------
ОК  
---------------------------


procedure ExecuteAction(Action: TProc);
begin
 Action();
end;

procedure DoWork(ACallback: TProc);
begin
end;

procedure RunTest();
var
 Callback: TProc;
begin
 Callback := procedure begin end;
 ExecuteAction(procedure begin DoWork(Callback); end);
end;

procedure TForm3.FormCreate(Sender: TObject);
begin
 ReportMemoryLeaksOnShutdown := True;

 RunTest();
end;


 
MBo ©   (2014-11-17 17:16) [1]

XE5 - да


 
Внук ©   (2014-11-18 18:17) [2]

XE6 - да


 
Юрий Зотов ©   (2014-11-19 10:58) [3]

Жень, а эти навороты действительно необходимы, или можно обойтись без них?


 
jack128 ©   (2014-11-19 11:07) [4]


> Жень, а эти навороты действительно необходимы, или можно
> обойтись без них?

Нет, конечно. Асма достаточно для решения любой задачи.


 
Юрий Зотов ©   (2014-11-19 11:13) [5]

> jack128 ©   (19.11.14 11:07) [4]

Жень, я серьезно. Писали же без всех этих фокусов и нужды в них не испытывали. Тут вдруг ты их используешь - то ли это дань моде, то ли действительно необходимость. Вот и спрашиваю - почему?


 
jack128 ©   (2014-11-19 11:34) [6]


>  Тут вдруг ты их используешь - то ли это дань моде, то ли
> действительно необходимость.

В дельфи я лямбды практически не использую из-за их убогоо синтаксиса.
А конкретный пример, когда я на багу эту наткнулся схематично выглядит так:

procedure ProccessItems(ASource: TArray<TItem>; ADest: TItem);
var
 SkipException: TFunc<Exception, boolean>;
 SkipAllExceptions: boolean;  
begin
  SkipAllExceptions := False;
 // // SkipException определяет продолжать ли копирование элементов, если где то по середине процесса возникло исключение.
  SkipException := function (E: Exception): boolean
   begin
     if SkipAllExceptions then Exit(True);
     case MessageDlg("Скипнуть исключение?", [mbYes, mbNo, mbYesForAll]) of
       mrYes: Exit(True);
       mrNo: Exit(False);
     else
       SkipAllExceptions := True;
       Exit(True);
     end;
   end;
 ProgressForm := TProgressForm.Create(nil);
 try
 // ExecuteInThreadWithProgress выполняет функцию в доп. потоке и показывает модально окно  на время работы этого потока
   ExecuteInThreadWithProgress(procedure
     begin
       CopyItemsRecurse(ASource, ADest, SkipException);
     end, ProgressForm)
 finally
   ProgressForm.Free;
 end;
end;


 
DVM ©   (2014-11-19 16:45) [7]


> jack128 ©   (19.11.14 11:34) [6]


> В дельфи я лямбды практически не использую из-за их убогоо
> синтаксиса.

А в делфи есть лямбда выражения? В ветке я вижу только анонимные функции.


 
han_malign ©   (2014-11-19 17:25) [8]


> В ветке я вижу только анонимные функции.

- если анонимная функция поддерживает замыкание(то есть является анонимным функтором), то её модно называть лямбдой...


>   Callback := procedure begin end;
>   ExecuteAction(procedure begin DoWork(Callback); end);

- т.к. в Delphi не очень жалуют статическое размещение - скорее всего старая добрая проблема с зацикливанием перекрёстного счетчика ссылок ...
Неземная страсть у них - ссылку на владельца хранить...


 
Rouse_ ©   (2014-11-19 17:33) [9]

Jack128 говорит:

> скорее всего старая добрая проблема с зацикливанием перекрёстного
> счетчика ссылок ...

непонятно, с чего бы эта проблема возникла. Callback никаких ссылок никуда не должен хранить.


> А в делфи есть лямбда выражения? В ветке я вижу только анонимные
> функции.

А в чем различия?


 
Юрий Зотов ©   (2014-11-19 18:20) [10]

А кто-нибудь может привести пример, в котором без всех этих лямбд и/или анонимных функций было бы действительно не обойтись?


 
Rouse_ ©   (2014-11-19 18:27) [11]

Юрч, это будет практически такойже код, только раздутый раза в четыре


 
Rouse_ ©   (2014-11-19 18:28) [12]

Зы: и да - токого кода, где не обойтись, никто не приведет


 
Rouse_ ©   (2014-11-19 18:43) [13]

Jack128 говорит:

> А кто-нибудь может привести пример, в котором без всех этих
> лямбд и/или анонимных функций было бы действительно не обойтись?

Я вроде написал, что > Асма достаточно для решения любой задачи.
Юр, ты какого ответа то хочешь? Любой тьюринг полный язык может решить любую алгоритмическую задачу.
Давай, предложи свое решение procedure ProccessItems(ASource: TArray<TItem>; ADest: TItem); без лямбд, с сохранением читабельности?


 
Юрий Зотов ©   (2014-11-19 19:35) [14]

> Любой тьюринг полный язык может решить
> любую алгоритмическую задачу


А тогда зачем усложнять язык? Ведь чем он проще - тем читабельнее, это же очевидно.

> это будет практически такойже код, только раздутый раза в четыре
> предложи свое решение


Делаем SkipException обычной функцией, за пределами ProccessItems. Кода столько же и делает он то же самое, а читабельность лучше.

=========================

Вообще, вызов функции с передачей ей коллбэка - задача настолько избитая, что и говорить-то о ней как-то даже неудобно. Разве что упомянуть, что до сих пор она спокойненько кодировалась без всяких лямбд. Причем вполне читабельно и без раздувания кода.


 
Юрий Зотов ©   (2014-11-19 19:45) [15]

Нет, возможно, у этих лямбд действительно есть какие-то примущества. Может быть они, например, удобнее в отладке, или дают более шустрый/компактный машинный код, или еще что-то. Но что именно?


 
Rouse_ ©   (2014-11-19 19:56) [16]


> Юрий Зотов ©   (19.11.14 19:45) [15]

Юрч, еще раз повторяю. Все что раньше Жека расписал сделать можно и без лямбд, анонимок и шут с ними - замыканий. Просто код раздуется в четыре раза.
В его случае получается достаточно компактная и при этом читаемая функция, выполняющая (если брать оригинальную идею) достаточно размазанный по сути и по логике код.


 
Юрий Зотов ©   (2014-11-19 20:06) [17]

> Rouse_ ©   (19.11.14 19:56) [16]
> код раздуется в четыре раза.


С чего? Тот же самый код выносим наружу - чего б ему раздуваться?


 
Rouse_ ©   (2014-11-19 20:12) [18]


> Юрий Зотов ©   (19.11.14 20:06) [17]
> С чего? Тот же самый код выносим наружу - чего б ему раздуваться?

Ну хорошо, меряться - так вай бы и нот?
Напиши аналог этой процедуры (заметь - это всего лишь одна процедура), а там и посмотрим размеры и читабельность :)
Для упрощения будем считать что ExecuteInThreadWithProgress не зупускает отдельную нить.


 
Ellisium ©   (2014-11-19 21:35) [19]


> А кто-нибудь может привести пример, в котором без всех этих
> лямбд и/или анонимных функций было бы действительно не обойтись?
>
>

дядь Юр, а приведите код, где невозможно обойтись без классов.


 
Rouse_ ©   (2014-11-19 21:39) [20]


> Ellisium ©   (19.11.14 21:35) [19]

Ох ты и забросил :))))


 
DVM ©   (2014-11-19 21:42) [21]


> Rouse_ ©   (19.11.14 17:33) [9]


> А в чем различия?

В записи.

В лямбда выражении должен присутствовать лямбда оператор (=>, -> и прочее). Вот лямбда выражение: y => y * 2

Синтаксис же анонимных функций в делфи можно лямбда выражениями назвать лишь с натяжкой. Удобства записи никакого, читабельность кода только ухудшает.


 
Юрий Зотов ©   (2014-11-19 21:49) [22]

Ну, набросал на скорую руку. За абсолютную правильность не ручаюсь, но в данном случае важно показать принцип, а не отсутствие ошибок.

И где тут 4-х кратное разбухание кода?

var
 ASource: TArray<TItem>;
 ADest: TItem);
 SkipAllExceptions: boolean;

function SkipException(E: Exception): boolean;
begin
 if SkipAllExceptions then Exit(True);
 case MessageDlg("Скипнуть исключение?", [mbYes, mbNo, mbYesForAll]) of
   mrYes: Exit(True);
   mrNo: Exit(False);
   else
     begin
       SkipAllExceptions := True;
       Exit(True);
     end;
 end;
end;

procedure Work;
begin
 CopyItemsRecurse(ASource, ADest, @SkipException);
end;

procedure ProccessItems(ASource: TArray<TItem>; ADest: TItem);
begin
 SkipAllExceptions := False;
 ProgressForm := TProgressForm.Create(nil);
 try
   ExecuteInThreadWithProgress(@Work, ProgressForm);
 finally
   ProgressForm.Free;
 end;
end;


 
Юрий Зотов ©   (2014-11-19 21:57) [23]

> Ellisium ©   (19.11.14 21:35) [19]
> а приведите код, где невозможно обойтись без классов.

Дружище, не надо меня ловить на мякине. Естественно, я прекрасно понимаю, что можно обойтись и без ООП, из без лямбд там всяких. Но ООП дает программисту серьезные удобства (перечислять их, думаю, не стоит, они и без того всем известны). А вот какие удобства дают лямбды - мне непонятно. Зато понятно, что читабельность они ухудшают.


 
DVM ©   (2014-11-19 22:02) [24]


> Юрий Зотов ©   (19.11.14 21:57) [23]


> А вот какие удобства дают лямбды - мне непонятно. Зато понятно,
>  что читабельность они ухудшают.

ну некоторые удобства они дают во всякого рода итераторах и компараторах удобно передавать в поток и т.д.


 
Rouse_ ©   (2014-11-19 22:02) [25]


> Синтаксис же анонимных функций в делфи можно лямбда выражениями
> назвать лишь с натяжкой. Удобства записи никакого, читабельность
> кода только ухудшает.

Там вообще-то на входе лямбда-делегат, ты об чем? :)
Давай щас еще о разнице в анонимках, лябдах и замыканиях поспорим :)


 
jack128 ©   (2014-11-19 22:03) [26]


> Ну, набросал на скорую руку

Юр, отличный код. 3 глобальных переменных для такой простой задачи - это супер, я б так не смог. А если учесть что исходно задача многопоточная - ну так вообще прекрасно.


 
Rouse_ ©   (2014-11-19 22:05) [27]


> Юрий Зотов ©   (19.11.14 21:49) [22]
> И где тут 4-х кратное разбухание кода?

На пьяную голову буянить не буду - просто скажу - этот код не верный. Завтра покажу правильный, в обоих вариантах, с анонимками и без оных :)


 
Rouse_ ©   (2014-11-19 22:09) [28]

Кстати Жек, а я ж тебе говорил - что эти вещи нужно ввиде статьи выкатывать, ибо столько нюансов, которые с наскоку не понять. А ты все отказывашся...


 
Ellisium ©   (2014-11-19 22:11) [29]


> Естественно, я прекрасно понимаю, что можно обойтись и без
> ООП


> А вот какие удобства дают лямбды - мне непонятно

ну дык зачем тогда подменять понятия.

Не стоит ставить вопрос как "приведите пример, когда без лямбд нельзя обойтись". Потому что и без ООП можно обойтись в 100% случаев.

Надо ставить вопрос "Приведите пример, когда  лямбды упрощают код", тогда все встает на свои места. Если привыкнуть и свыкнуться - лямбды упрощают в некоторых случаях код, не так масштабно и понятно как ООП и зачастую не в Delphi. И большинство литературы по этой теме на понятно каком языке. Но тем не менее.
Хотя могут и усложнять код и запутывать. Точно также как ООП.


 
Юрий Зотов ©   (2014-11-19 22:13) [30]

> jack128 ©   (19.11.14 22:03) [26]

Глобальные переменные пришлось вводить потому, что мне недоступны декларации функций. Тебе они доступны, так что все легко передается через параметры.

Касательно многопоточности - Розыч ее отменил. Хотя и это не проблема.

> Rouse_ ©   (19.11.14 22:05) [27]

Только не старайся специально раздуть код в 4 раза? OK ?
:o)


 
Ellisium ©   (2014-11-19 22:15) [31]

Кстати, посмотрите на эволюцию Розыча.

Два года назад Розыч - это "нафига эти лямбды и анонимные функции, ересь".
Розыч сейчас - ну да, штука специфичная, но иногда полезная.

Влияние Жэки налицо )))


 
Юрий Зотов ©   (2014-11-19 22:16) [32]

> Ellisium ©   (19.11.14 22:11) [29]

См. [15].


 
jack128 ©   (2014-11-19 22:17) [33]


> Глобальные переменные пришлось вводить потому, что мне недоступны
> декларации функций.

дык меняй их как хочешь, как те удобно. Это "твой" код.


 
Rouse_ ©   (2014-11-19 22:23) [34]


> Касательно многопоточности - Розыч ее отменил. Хотя и это
> не проблема.

??? Че эта? :)


> Только не старайся специально раздуть код в 4 раза? OK ?

Ок


> Ellisium ©   (19.11.14 22:15) [31]
> Кстати, посмотрите на эволюцию Розыча.
>
> Два года назад Розыч - это "нафига эти лямбды и анонимные
> функции, ересь".
> Розыч сейчас - ну да, штука специфичная, но иногда полезная.

> Влияние Жэки налицо )))

Ну... Жека это такая специфическая болячка, он весь на IT отдел перетряхнул, причем таким образом, что даже Макс Черных (наш техдиректор), прежде чем говорить что все плохо, сначала уточняет в большинстве случаев у Жеки (а действительно ли оно так) :)
Да что там - я сам практически повседневно консультируюсь у Жеки.
Жека наше все - и здесь я даже не шучу :)


 
jack128 ©   (2014-11-19 22:27) [35]


>  Это "твой" код.

естественно реюзабельность ExecuteInThreadWithProgress и CopyItemsRecurse - нужно сохранить. То есть сигнатуру ты их можешь менять, но тогда уж ты должен иметь в виду, что они используются в туче мест, и ты должен будешь переписать все эти места типа такого:

procedure DoWork2(Arg: TMyArg);
begin
 ExecuteInThreadWithProgress(procedure begin DoSamething(Arg); end, OtherForm);
end;

procedure DoWork3(ASource: TArray<TItem>; ADest: TItem; Arg: TMyOtherArg)
begin
 CopyItemsRecurse(ASource, Dest, fucntion begin Exit(OtherSkipExсeptionLogic(Arg)) end );
end;


и тд и тп.  

ЗЫ.  Подумай на фразой:
> Объекты - это замыкания/лямбды для бедных.


 
DVM ©   (2014-11-19 22:31) [36]


> Rouse_ ©   (19.11.14 22:02) [25]


> Там вообще-то на входе лямбда-делегат, ты об чем? :)

Какая разница делегат или нет. Разница в форме записи анонимных функций в языках поддерживающих лямбда выражения и в не поддерживающих (Delphi).


 
Rouse_ ©   (2014-11-19 22:35) [37]


> DVM ©   (19.11.14 22:31) [36]
> Какая разница делегат или нет. Разница в форме записи анонимных
> функций в языках поддерживающих лямбда выражения и в не
> поддерживающих (Delphi).

Я ждал этого :)
Теперь приведи вариянты кода для анонимки, для ламбды и для замыкаминя :)


 
DVM ©   (2014-11-19 22:45) [38]


> Rouse_ ©   (19.11.14 22:35) [37]


> Я ждал этого :)


> Теперь приведи вариянты кода для анонимки, для ламбды и
> для замыкаминя :)

ты ждешь от меня три одинаковых фрагмента кода что ли? :)
второе в делфи не существует как таковое и его запись равна первому и оба они обладают свойством третьего :)

лямбда выражения - это средство записи анонимных функций, специального синтаксиса в делфи не имеют


 
Kerk ©   (2014-11-19 22:51) [39]

Замыкания более-менее адекватно без натяжек и недомолвок заменить можно только классами. Но код тогда действительно распухнет.


 
DVM ©   (2014-11-19 22:56) [40]


> Kerk ©   (19.11.14 22:51) [39]


> Замыкания более-менее адекватно без натяжек и недомолвок
> заменить можно только классами.

а вот здесь есть замыкание?

function A()
var
 x: integer;

 function B()
 begin
 
 end;

begin
 B()
end;



Страницы: 1 2 вся ветка

Форум: "Прочее";
Текущий архив: 2015.09.10;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.045 c
15-1413985851
Ламот
2014-10-22 17:50
2015.09.10
Как корректно скопировать /dev/mtd0 в образ и обратно (NAND)?


2-1398151360
Who_are_you?
2014-04-22 11:22
2015.09.10
Начало и размер буфера динамической переменной


15-1412932789
Kerk
2014-10-10 13:19
2015.09.10
Подсветка


15-1415898451
полвторого
2014-11-13 20:07
2015.09.10
Ega23, а я песню Вам нашёл!


15-1417298499
Pavia
2014-11-30 01:01
2015.09.10
Родить объект





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский