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

Вниз

Качество кода   Найти похожие ветки 

 
Юрий Зотов ©   (2009-06-07 14:48) [40]

> TIniFile   (07.06.09 14:33) [36]

New выделила 4 байта. Dispose их же и освободит, но только уже по другому адресу (т.к. значение указателя изменилось). Поэтому при Dispose теряем InstanceSize-4.

Общие же потери памяти составят InstanceSize (т.к. выделенные New 4 байта тоже были потеряны при создании объекта). А с учетом [35] - больше.

PS
Спокойнее, дружище, зачем так много эмоций?


 
Юрий Зотов ©   (2009-06-07 15:01) [41]

> TIniFile   (07.06.09 14:45) [39]

> New (PIni) - выделили SizeOf(Pointer) под указатель на объект.

Да. То есть, выделили 4 байта.

> PIni^ := TIniFile.Create - Записали в эту выделенную память указатель на
> созданный объект.

Нет. В статическую переменную PIni (а не в только что  выделенные 4 байта) записали адрес созданного объекта. Теперь значение PIni изменилось и предыдущие 4 байта (которые выделила New) потеряны.

> Dispose (PIni) - освободили память, занятую указателем.

Нет. Dispose (PIni) освободит первые 4 байта по адресу, который содержится в переменной PIni. А в ней теперь лежит уже не адрес, который выделила New, а адрес объекта. То есть, будут освобождены первые 4 байта из области памяти, занятой объектом, а остаток этой области будет потерян.


 
Юрий Зотов ©   (2009-06-07 15:07) [42]

Блин. Или я не прав? Щас проверим, только Delphi запущу.
:o)


 
TIniFile   (2009-06-07 15:12) [43]


> Спокойнее, дружище, зачем так много эмоций?

Извиняюсь, уж больно сильное впечатление произвело :)


> New выделила 4 байта. Dispose их же и освободит, но только
> уже по другому адресу (т.к. значение указателя изменилось).
>  Поэтому при Dispose теряем InstanceSize-4.

То есть как "по другому адресу"? Dispose освободит именно те 4 байта, которые были выделены предыдущим вызовом New. То есть мы объявили PIni : ^TIniFile. Для простоы рассуждений будем считать, что изначально PIni = nil, ну допустим сами его проинициализировали, имеем ведь право. Так-же для простоты будем считать, что в нашем классе нет никаких ссылочных полей, а его InstanceSize = $30.
В результате вызова New(PIni) были выделены 4 байта по адресу, например, $5000.
Далее вызвали конструктор, допустим он создал объект по адресу $10000. Это значит, что по адресу $10000 было выделено $30 байт и эта область была проинициализирована так, чтобы стать объектом. После этого адрес этой области был записан в четыре ячейки, адрес которых хранится в PIni. То есть в ячейках $5000..$5003 теперь лежит число $10000.
В результате Dispose(PIni) освобождены 4 байта по адресу $5000 - то бишь те, где хранился адрес объекта. Но сам объект, все его $30 байт, как лежали по адресу $10000, так там и истались. Ни о каком InstanceSize-4 речи идти не может. Потяряно именно InstanceSize байт, не считая разумеется ссылок на внешние данные, если таковые имеются.


 
Юрий Зотов ©   (2009-06-07 15:19) [44]

> TIniFile   (07.06.09 15:12) [43]

Вы правы.
:o)


 
Palladin ©   (2009-06-07 15:31) [45]

как все сложно )


 
Юрий Зотов ©   (2009-06-07 15:34) [46]

> Palladin ©   (07.06.09 15:31) [45]

Особенно, когда невнимателен...
:o)


 
Palladin ©   (2009-06-07 16:47) [47]

Та... так кореть не бутет ) (С) ВК2, Гоблин...

и все таки она есть... достойная смена... :)


 
Юрий Зотов ©   (2009-06-07 17:14) [48]

> Palladin ©   (07.06.09 16:47) [47]

Есть, безусловно. Вот бы еще в ответах такую же активность...
:о)


 
TIniFile   (2009-06-07 17:28) [49]


> Palladin ©   (07.06.09 16:47) [47]
>
> и все таки она есть... достойная смена... :)

Боюсь, Вы куда лучше подходите на роль смены для меня, чем я для Вас:))


 
Palladin ©   (2009-06-07 17:57) [50]

Мда. ) а я так надеялся...


 
jack128_   (2009-06-07 20:46) [51]

Мдя.. Сказывается джависткое настоящее :-D


 
Кто б сомневался ©   (2009-06-07 20:50) [52]


> pasha_golub ©   (05.06.09 19:00) [14]
>
> Блин, люди оказывается даже посмотрели. Я думал вою про
> вирусы будет... :)


А вы все вирусофобией страдаете. :) Бедный-бедный.


 
Юрий Зотов ©   (2009-06-07 21:10) [53]

> jack128_   (07.06.09 20:46) [51]

Обидеть художника может каждый... ну да Бог с ним. Евгений, лучше скажите - как обстоят Ваши дела с ликвидацией Ваших проблем с пониманием основ объектно-ориентрованного программирования?

Может, консультация какая, или помощь нужна? Обращайтесь, если что.
:о)


 
capkoh ©   (2009-06-08 13:14) [54]

Какое-то время назад я поднимал такой же вопрос. Могу лишь посоветовать автору при использовации чего-либо сначала поискать в справке информацию об этом чём-то. И, конечно, попытаться найти для себя подходящую книгу по основам.


 
Student ©   (2009-06-22 10:41) [55]

Здравствуйте. Снова я. Вопрос прежний:
1) Программа написана в хорошем стиле ООП?
2) Правильно пытался использовать соглашения о наименовании(форматирование там, отступы и пр....)
Нашёл книжицу Delphi Code Standart, старался по советам в книге действовать.
И ещё вопрос: Как научиться думать "по объектно-ориентированному"? -). Надо паттерны читать? Это я к тому спросил. У меня в программе получается работают 22 таймера, это же не есть гуд? На работе подсказали документацию по многопоточным приложениям читать(потоки, класс TThread), его использовать для работы программы. Ps. Программа не совсем функционирует, буду дорабатывать.
Ссылка на сырцы - http://www.sharemania.ru/0263651
Имя файла: WinChas.rar
Размер файла: 522,09 Kb.
И еще: Щас функционал допишу и начну обвешивать конструкциями try except Верный подход?


 
brother ©   (2009-06-22 10:47) [56]

> Ссылка на сырцы - http://www.sharemania.ru/0263651

with почему не используешь?
http://www.citforum.ru/programming/delphi/style_delphi/ читал?


 
Медвежонок Пятачок ©   (2009-06-22 10:49) [57]

когда в программе 22 таймера, на with конечно надо в первую очередь обращать внимание
:)))

ps все стереть и переписать заново.
pps не качал и не смотрел


 
Anatoly Podgoretsky ©   (2009-06-22 10:53) [58]


> Щас функционал допишу и начну обвешивать конструкциями try
> except Верный подход?

Неверный.


 
jack128_   (2009-06-22 11:00) [59]

ужос.

   if FblStateAdr then
   begin
     imgComputer.Picture.Bitmap.FreeImage;
     imgComputer.Picture.Bitmap.LoadFromFile(Ini.ReadString("Dir","Image", "")
          + "CompLime.bmp");
   end else
   begin
     imgComputer.Picture.Bitmap.FreeImage;
     imgComputer.Picture.Bitmap.LoadFromFile(Ini.ReadString("Dir","Image", "")
          + "CompBlue.bmp");
   end;


так:

     imgComputer.Picture.Bitmap.FreeImage;
     imgComputer.Picture.Bitmap.LoadFromFile(Ini.ReadString("Dir","Image", "")
          + IIF(FblStateAdr , "CompLime.bmp", "CompBlue.bmp"));


так нельзя было переписать?

 Ini := TIniFile.Create(ExtractFilePath(Paramstr(0))+"Chas.ini");
 try
    // туча коду
 except
   FreeAndNil(Ini);
 end;
 FreeAndNil(Ini);
end;  

на try - finally - end нуно менять. К ООП очевидно это все не имеет никакого отнашения


 
Student ©   (2009-06-22 11:13) [60]


> jack128_   (22.06.09 11:00) [59]
>
> ужос.
и на try - finally - end нуно менять.

эээмммммммм......незнал ещё такого трюка, щас переделаю -(( На try-finally тоже щас чиркану....


> brother ©   (22.06.09 10:47) [56]
> with почему не используешь?

По поводу with - несогласен. Путает он, я ж по памяти не помню какие там методы в картинках всяких, поэтому пишу imgКартинка, сталю точку и Delphi сама выводит список методов. Не буду with использовать! -)


> Медвежонок Пятачок ©   (22.06.09 10:49) [57]
>
> когда в программе 22 таймера,
> :)))
>
> ps все стереть и переписать заново.
> pps не качал и не смотрел
>

Есть у меня задумка по этому поводу, с одним таймером..... Эммммм, я так думаю делать, .....

 DecodeTime(NewTime, Hour, Min, Sec, MSec);
 case Sec of
   0,12,24,36,48: begin
                          Вызвать метод проверки ССО
                        end;
   6,18,30:          begin
                          Вызвать метод проверки компьютеров
                        end;
 end;

Тоже неверный подход? -((((


 
Медвежонок Пятачок ©   (2009-06-22 11:15) [61]

конечно неверный


 
Student ©   (2009-06-22 11:22) [62]


> Медвежонок Пятачок ©   (22.06.09 11:15) [61]
>
> конечно неверный

а подскажи пожалуйста подход по возможности -)


 
Медвежонок Пятачок ©   (2009-06-22 11:28) [63]

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


 
Student ©   (2009-06-22 11:36) [64]


> Медвежонок Пятачок ©   (22.06.09 11:28) [63]
>
> у тебя запуски проверок происходят без учета того, завершилась
> предыдущая проверка или нет.
> а запуски частые


Согласен. Исходя из ваших рассуждений, следует назначит приоритетность проверок. Естественно самая приоритетная проверка - СЕРВЕР. Если он не доступен - по умолчанию ничего не будет работать. Значит я проверяю ДОСТУПНОСТЬ сервера, скажем раз в секунду, и если доступен, то проверяю дальше. Если во время выполнения других проверок оказывается что сервер недоступен, это как раз дело конструкции try-except. Это уже детали.

Как мне можно избавится от 22 таймеров? В каком направлении мне копать?


 
Медвежонок Пятачок ©   (2009-06-22 11:39) [65]

в дизайнере мышкой выдели 21 таймер и нажми del


 
Student ©   (2009-06-22 11:52) [66]


> Медвежонок Пятачок ©   (22.06.09 11:39) [65]
>
> в дизайнере мышкой выдели 21 таймер и нажми del
>

Несмотрели код. -((( ...Проблема серьёзнее.... Вкраце проблема.... Есть, допустим, 50 объектов. Каждый объект что то там делает. Чтоб это что то они делали нужно чтоб код позволял. Выход: 1 - в цикле крутить постоянно 2- таймеры(по истечению интервала времени - повторный вызов) 3 - как я щас думаю: в одном таймере блок

 DecodeTime(NewTime, Hour, Min, Sec, MSec);
 case Sec of
   0,12,24,36,48: begin
                    thrTest := TTest.Create(True);
                    thrTest.FreeOnTerminate := True;
                    thrTest.Priority := tpNormal;
                    thrTest.Resume;
                  end; //кинуть в другой поток и пусть там делается. При этом сами объекты уже будут демонстрировать другим свои состояния (через property)
  6,8,30: begin
               Другая проверка
             end;

Как то так?


 
Медвежонок Пятачок ©   (2009-06-22 11:57) [67]

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


 
Student ©   (2009-06-22 12:07) [68]

Всё верно. Ладно....я тогда щас переделывать начну с одним таймером+поток, добью полностью фунционал и скину на днях. Пасибо


 
brother ©   (2009-06-22 12:07) [69]

> добью полностью фунционал и скину на днях

типа на проверку?


 
Student ©   (2009-06-22 12:11) [70]

Ну.....типо да получается? Я ж не функционал спрашиваю, а в общем представлении.


 
Медвежонок Пятачок ©   (2009-06-22 12:18) [71]

begin
                   thrTest := TTest.Create(True);
                   thrTest.FreeOnTerminate := True;
                   thrTest.Priority := tpNormal;
                   thrTest.Resume;
                 end; //кинуть в другой поток и пусть там делается. При этом сами объекты уже будут демонстрировать другим свои состояния


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

У тебя пробелы не то что с ООП, но и процедурным подходом полный алес.


 
Student ©   (2009-06-22 12:24) [72]


> Медвежонок Пятачок ©   (22.06.09 12:18) [71]
> И что это меняет?
> таймер тикнет после этого на 12 секунде минуты и ты снова
> тупо запустишь еше одну нитку проверки.
> А предыдущая возможно еще не завершилась, либо завершилась
> секунду назад.
>
> У тебя пробелы не то что с ООП, но и процедурным подходом
> полный алес.


Я просто не понимаю, так когда по другому сделать можно? Если ни таймер, ни цикл. Программа то не один раз должна отработать, а постоянно, во времени, чтоб выполнялись данные проверки. :((


 
Медвежонок Пятачок ©   (2009-06-22 12:26) [73]

в том числе несколько параллельных и одинаковых?


 
Медвежонок Пятачок ©   (2009-06-22 12:31) [74]

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


 
Student ©   (2009-06-22 12:38) [75]

:-( Медвежонок Пятачок ©. Последний, наверное, самый дурацкий вопрос. Подскажи чё почитать чтоб мыслить так, как ты говоришь? Паттерны выправляют ум?


 
Медвежонок Пятачок ©   (2009-06-22 12:44) [76]

не знаю. я про паттерны никогда ничего не читал.


 
Cobalt ©   (2009-06-22 15:01) [77]

ставь флаг "Проверка сервера".

Вспомни очередь в магазине (кстати, на этой теме Рихтер делал пример для потоков)
Если у кассира смена ленты в кассовом аппарате, покупатели или ждут кассира, или уходят из магазина без покупки ;-)

А кассиру то пофиг, пока в аппарате ленту не поменяет, пробивать не сможет.


 
Student ©   (2009-06-23 12:16) [78]

Cobalt ©   (22.06.09 15:01) [77] - пасибо вам.

Снова я :-(( Изобрёл подход от избавления от 22 таймеров. Делаю один единственный класс опрашивающий системное время компьютера. В нём будет метод Tick - будет брать системное время с интервалом 1 сек.

TSystemClock = class(TObject)
private
 tmrClock : TTimer;
 procedure _Tick;
public
end;

procedure TSystemClock._Tick;
begin
DecodeTime(NewTime, Hour, Min, Sec, MSec);
case Sec of
  0,12,24,36,48: begin
                         Проверка ПСИ
                      end;
 6,8,30: begin
              Проверка компьютеров
            end;
end;

Естественно в каждом объекте будут отражены состояния и задан приоритет проверки Сервер - приоритет = 0 (самый приоритетный) СБОР приоритет = 1 (чуть менее приоритетный) и т.д. Объекты будут "спрашивать приоритет" у высших по иерархии приоритетов.
Такой подход может расчитывать право на жизнь?
Пасибо


 
Медвежонок Пятачок ©   (2009-06-23 14:11) [79]

прекрасный пример бесполезного класса который ничего не умеет и не делает ничего, чего не умеет делать и не может делать TTimer


 
Медвежонок Пятачок ©   (2009-06-23 14:13) [80]

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

а если придет в голову идея повторного использования этого чуда (собственно для чего и делают пользовательские классы), то его придется переписывать заново.



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

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

Наверх





Память: 0.63 MB
Время: 0.009 c
6-1205792707
cerber
2008-03-18 01:25
2009.08.23
Twebbrowser and Newwindow


15-1245437339
Unknown user
2009-06-19 22:48
2009.08.23
DrawGrid, только вместо ячеек - панели


1-1211977078
TForumHelp
2008-05-28 16:17
2009.08.23
Создание компонента


15-1245752128
vajo
2009-06-23 14:15
2009.08.23
Глюк в сети. Подскажите.


15-1245866318
Игорь Шевченко
2009-06-24 21:58
2009.08.23
Чем можно распаковать многотомный tar-архив под windows ?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский