Home
Top.Mail.Ru Yandeks.Metrika
Forum: "Beginners";
Current archive: 2011.12.18;
Download: [xml.tar.bz2];

Down

string constants Find similar branches


Gu   (2011-09-01 18:58) [0]

Приложение использует много строковых констант, которые юзаются во многих его модулях. Вопрос: как будет правильнее объявить их: в начале основного модуля (все другие его юзают) в разделе Consts или в разделе Resourcestring? Есть ли между ними большие отличия и влияет ли это на скорость работы и расход памяти при загрузке приложения и работе?



Ega23 ©   (2011-09-01 19:28) [1]


> в начале основного модуля



_Юрий   (2011-09-01 19:29) [2]


>  в разделе Consts или в разделе Resourcestring?


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



Gu   (2011-09-01 20:06) [3]

Т.е. я так понимаю, что в слчае с Resourcestring прога при использовании их в процедурах будет каждый раз лазить в свои ресурсы (т.е. выполнять файловую операцию), а в случае с константами - все операции производятся в памяти?



Anatoly Podgoretsky ©   (2011-09-01 20:07) [4]

> Gu (01.09.2011 18: 58: 00) [0]

Resourcestring правильнее и оптимальнее, об этом заботится система.



Rouse_ ©   (2011-09-01 20:07) [5]

В обоих случаях операция производится в памяти



Anatoly Podgoretsky ©   (2011-09-01 20:20) [6]

> Rouse_ (01.09.2011 20: 07: 05) [5]

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



Rouse_ ©   (2011-09-01 20:50) [7]


> Anatoly Podgoretsky © (01.09.11 20: 20) [6]
> Только в первом в памяти все, что сумеет подгрузить, а с
> ресурсами по потребностями

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



Anatoly Podgoretsky ©   (2011-09-01 20:52) [8]

> Rouse_ (01.09.2011 20: 50: 07) [7]

Грузится по 16 строк.



Rouse_ ©   (2011-09-01 21:00) [9]

Entirely loaded :) If the image of the executable file was not loaded into the memory together with all sections, including the resource section, then such a concept as an image dump would not be possible.



Rouse_ ©   (2011-09-01 21:01) [10]

PS: compile this demo here, it clearly shows everything, where and how: http://rouse.drkb.ru/winapi.php#pmm



Игорь Шевченко ©   (2011-09-01 22:48) [11]

Rouse_ © (01.09.11 21: 00) [9]

100-мегабайтный инсталлятор тоже целиком в память грузится ?

вот у меня есть файл:

Turbo Dump  Version 6.3.0.0 Copyright (c) 1988-2009 Embarcadero Technologies, Inc.
        Display of File windowsxp.x86.fre.rtm.symbols.exe

Object table:
#   Name      VirtSize    RVA     PhysSize  Phys off  Flags  
--  --------  --------  --------  --------  --------  --------
01  .text     000085F2  00001000  00008600  00000400  60000020 [CER]
02  .data     00001BE4  0000A000  00000400  00008A00  C0000040 [IRW]
03  .rsrc     095D4000  0000C000  095D3E00  00008E00  40000040 [IR]

Все секции будут при запуске сразу на память отображены ?



Rouse_ ©   (2011-09-02 01:26) [12]

Installer? And in what way does it relate to the executable file? Boot stub and section transferred to MSI service



Игорь Шевченко ©   (2011-09-02 09:49) [13]


> А коим образом он к исполняемому файлу то относится?


имеет PE-формат



Rouse_ ©   (2011-09-02 10:38) [14]


> Igor Shevchenko © (01.09.11 22: 48) [11]

Кстати именно этот инсталятор таки да, грузится целиком...



Игорь Шевченко ©   (2011-09-02 10:38) [15]


> Кстати именно этот инсталятор таки да, грузится целиком.
> ..


prove it



Игорь Шевченко ©   (2011-09-02 10:40) [16]

Для начала неплохо бы договориться о терминологии: что значит "грузится" ?



Rouse_ ©   (2011-09-02 10:41) [17]


> Igor Shevchenko © (02.09.11 10: 38) [15]
> prove it

http://rouse.drkb.ru/tmp/m.png



han_malign   (2011-09-02 10:53) [18]


> prove it

http://support.microsoft.com/default.aspx?scid=kb;en-us;193678



Игорь Шевченко ©   (2011-09-02 12:56) [19]

Это все хорошо, но где написано, что "грузятся" ? Хоть на одной картинке ?
Лежат себе на диске преспокойно, как и неиспользуемые страницы кодового сегмента.



Rouse_ ©   (2011-09-02 13:09) [20]


> Igor Shevchenko © (02.09.11 12: 56) [19]
>
> Это все хорошо, но где написано, что "грузятся" ? Хоть на
> одной картинке ?
> Лежат себе на диске преспокойно, как и неиспользуемые страницы
> кодового сегмента.

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



Игорь Шевченко ©   (2011-09-02 13:15) [21]

Rouse_ © (02.09.11 13: 09) [20]

А если запустить FileMon до запуска процесса ? Он покажет чтение ВСЕГО исполняемого файла ?



Rouse_ ©   (2011-09-02 13:17) [22]

Да, файл будет зачитан целиком



Slym ©   (2011-09-02 13:26) [23]

Rouse_ © (02.09.11 13: 17) [22]
антивирь отключи чтоб не сканил предварительно



Rouse_ ©   (2011-09-02 13:32) [24]

Я на виртуалке тестировал, у меня файл символов там лежит с сайсом, там антивиря нет...



Игорь Шевченко ©   (2011-09-02 13:32) [25]

ради интереса запустил FileMon и указанный файл. Чтения всех 146 мегабайт не увидел. И не ожидал увидеть, так как в книжках, начиная с Рихтера, написано, что исполняемые файлы читаются по мере надобности, а не  целиком при запуске.



Rouse_ ©   (2011-09-02 13:33) [26]

Did you see the reading during the dump?



Rouse_ ©   (2011-09-02 13:34) [27]

By the way, didn’t you see the upload of the entire resource section to a temporary folder? I wonder then, how is she so without a full reading of that?



Игорь Шевченко ©   (2011-09-02 13:37) [28]


> А чтение при дампе увидел?


что такое дамп ?



Rouse_ ©   (2011-09-02 13:40) [29]

У максвела этот процесс описан вот так: http://www.netlib.narod.ru/library/book0010/ch08_07.htm



Игорь Шевченко ©   (2011-09-02 13:48) [30]


> У максвела этот процесс описан вот так


"Наиболее распространенным двоичным форматом Linux является ELF, поэтому рассмотрим, как двоичный обработчик ELF выполняет дамп памяти.
"

Как прикажешь тебя понимать ?

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



Rouse_ ©   (2011-09-02 13:59) [31]


> Как прикажешь тебя понимать ?

Ссылка была дана как описание того, что есть дамп памяти.


> Ты обращаешься ко всем страницам памяти в адресном пространстве
> процесса, вызывая их отображение на физическую память.

Откуда они отображаются? Где хранятся не отображенные данные?

Я же тебе еще раз говорю, ты сказал что не увидел зачитки всего файла.
Ладно допустим. Но проблемка в том что при старте инсталятор символов выгружает во временную папку хранящиеся в секции ресурсов файлы eula.txt simbols.cab simbols.cat и т.д.
Вопрос, откуда он их взял, чтения файла то не было по твоему утверждению? Или может быть все-же идущая перед выгрузкой запись запись LoadImage с указанием размера нам намекает?



Игорь Шевченко ©   (2011-09-02 15:06) [32]


> Откуда они отображаются? Где хранятся не отображенные данные?


на диске.


> Вопрос, откуда он их взял,


Вот в момент обращения к этим данным и было чтение. Через диспетчер памяти.



Rouse_ ©   (2011-09-02 15:11) [33]


> в момент обращения к этим данным и было чтение

А FileMon его не показал... понятно.



Юрий Зотов ©   (2011-09-02 15:20) [34]

Если я правильно понял Рихтера, то ни один файл (включая исполнимые) ПОЛНОСТЬЮ в ОЗУ никогда не грузится. Он отображается на АП процесса, а в ОЗУ грузится постранично, по мере надобности (конечно, с учетом еще и кэша страниц). То есть, сам дисковый файл как бы используется в качестве некоего свопа.



Юрий Зотов ©   (2011-09-02 15:22) [35]

Разве что весь файл умещается в одной странице... тогда загрузится полностью, конечно.
: O)



Rouse_ ©   (2011-09-02 15:39) [36]

Да это все понятно, просто я то речь веду про виртуальную память, а не про физическую...



Inovet ©   (2011-09-02 15:41) [37]

> [34] Yuri Zotov © (02.09.11 15: 20)
> файл как бы используется в качестве некоего свопа

Разве механизм не один и тот же что и в свопе. Просто файл и так уже на диске находится.



Inovet ©   (2011-09-02 15:44) [38]

> [36] Rouse_ © (02.09.11 15: 39)
> я то речь веду про виртуальную память

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



Игорь Шевченко ©   (2011-09-02 16:30) [39]

FileMon показывает чтение в физическую память :)



Anatoly Podgoretsky ©   (2011-09-02 16:50) [40]

> Yuri Zotov (02.09.2011 15: 20: 34) [34]

resourcestring именно такой, не гонится в своп, он сам часть свопа



Anatoly Podgoretsky ©   (2011-09-02 16:52) [41]

> Rouse_ (02.09.2011 15: 39: 36) [36]

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



Германн ©   (2011-09-03 00:50) [42]


> Anatoly Podgoretsky © (02.09.11 16: 52) [41]
>
>> Rouse_ (02.09.2011 15: 39: 36) [36]
>
> а мы как бы про физическую все время вели речь.

Ну и зачем вели?
По сабжу разницы практически никакой.



Германн ©   (2011-09-03 00:54) [43]

Вообще (имхо) сабж сам по себе глупый.
Ладно бы речь шла о математической обработке физического эксперимента. Или о математическом моделировании чего-то.



_Юрий   (2011-09-04 13:42) [44]

A little off topic

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

Поэтому я стал делать по другому: прятать константы в код, и его уже помещать в общие модули. Чаще всего подобные константы - текстовки ошибок.
Тогда  вместо, например

const
 SFileNotFound = "Файл %s не найден";

.
if not FileExist(fileName) then
 raise EPathException.CreateFmt(SFileNotFound, [fileName]);

пишу нечто типа

type
 EPathException = class(Exception)
public
   constructor FileNotFound(fileName: string);
end;

constructor EPathException.FileNotFound(fileName: string);
resourcestring;
 SFileNotFound = "Файл %s не найден";
begin
 CreateFmt(SFileNotFound, [fileName]);
end;

.
if not FileExist(fileName) then
 raise EPathException.FileNotFound(fileName);

Конструкторов может быть много - свой для каждого случая.

Если константа - какое то название, то ее лучше перенести в соответствующий класс (в виде вложенной константы, а если не позволяет версия Delphi, то в виде классовой функции). По тем же причинам.

Посмотрите, может быть вам такой подход покажется более подходящим



Игорь Шевченко ©   (2011-09-04 14:24) [45]

_Yuri (04.09.11 13: 42) [44]

VCL/RTL предлагают другой путь - по юнитам (rtl,db,...)consts

Где золотая середина ?

(Ну и до кучи - я не понимаю использования resourcestring в нелокализуемом проекте. Я вообще не понимаю использования resourcestring, потому что я не могу им управлять - не знаю идентификаторов ресурсов, а оставлять все это на откуп ITE - у меня с ним плохие отношения, еще со старых версий, где он глючил со страшной силой. Может, эти глюки и убрали, но осадок остался).



Anatoly Podgoretsky ©   (2011-09-04 14:53) [46]

> Igor Shevchenko (04.09.2011 14: 24: 45) [45]

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

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



Игорь Шевченко ©   (2011-09-04 15:08) [47]

Anatoly Podgoretsky © (04.09.11 14: 53) [46]

Я не знаю, решили ли они проблему (вроде читал, что каким-то образом решили) - есть тексты, которые надо переводить стороннему переводчику
( не знает разработчик китайского), чтобы он не имел доступа к исходным текстам и чтобы ему не надо было устанавливать программного обеспечения.



Anatoly Podgoretsky ©   (2011-09-04 15:55) [48]

> Igor Shevchenko (04.09.2011 15: 08: 47) [47]

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



Eraser ©   (2011-09-04 21:46) [49]

http://matrix.kladovka.net.ru/index.php?page=downloads&categ=other&pagenum=1 см. "multilang.zip". Мощнейшее и простое средство для работы с локализацией. Правда для полноценной работы я туда привинтил слабенькую поддержку коллекций, но зато теперь фактически универсальный инструмент. четвертый год работает отлично. а ITE мастдай, это с самого начало понятно. что за локализатор такой, которому исходники подавай? это противоречит всей концепции локализации проектов, т.к. обычно локализацию на аутсорс отдают.



_Юрий   (2011-09-05 21:39) [50]


> Igor Shevchenko © (04.09.11 14: 24) [45]


> VCL/RTL предлагают другой путь - по юнитам (rtl,db,...)consts


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



Игорь Шевченко ©   (2011-09-05 23:02) [51]

_Yuri (05.09.11 21: 39) [50]


> Сейчас, думаю, они бы написали уже не так.


Не уверен. У них каждый юнит consts относится к конкретному пакету, при разделении vcl на vcl и rtl константы тоже разделились, на consts (vcl) и rtlconsts

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

Я к тому, что у Борландов в такой организации констант есть цель.



_Юрий   (2011-09-06 20:24) [52]


> Igor Shevchenko © (05.09.11 23: 02) [51]


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



Pages: 1 2 whole branch

Forum: "Beginners";
Current archive: 2011.12.18;
Download: [xml.tar.bz2];

Top









Memory: 0.77 MB
Time: 0.044 c
1 - 1277897030
Tangar83
2010-06-30 15:23
2011.12.18
Error using TWebBrowser


15 - 1314396395
alexdn
2011-08-27 02:06
2011.12.18
Program for video


8 - 1221403444
Nevalyashka
2008-09-14 18:44
2011.12.18
MusicXML format


6 - 1248268608
Olleg_ator
2009-07-22 17:16
2011.12.18
POP3 encoding KOI


2 - 1315833646
patrick1968
2011-09-12 17:20
2011.12.18
Доступ с правами определенного пользователя





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
English French German Italian Portuguese Russian Spanish