View previous topic :: View next topic |
Author |
Message |
Моторокер
Joined: 06 May 2005 Posts: 1517 Location: г. Пермь (читается Перьмь)
|
(Separately) Posted: Mon Oct 08, 2007 11:19 Post subject: Плагин не должен использовать глобальные переменные |
|
|
В статье
Листер плагин на Borland Delphi 7 для начинающих
читаем
Evgeniy Savich wrote: | Надо добавить в проект форму, изменить ее имя на fmMain и сохранить модуль формы под именем unMain.pas. Эта форма и есть окно плагина.
В модуле unMain можно удалить бесполезную глобальную переменную:
var fmMain: TfmMain;
Замечание: ПЛАГИН НЕ ДОЛЖЕН ИСПОЛЬЗОВАТЬ ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ! |
Почему не должен и почему при их использовании всё работает? _________________ плагины для Total Commander, статьи Graphics Converter; NSCopy; SEO HTML; KillOK; Плагин на Delphi
ПармаСруб - строительство домов и бань в Перми |
|
Back to top |
|
|
CaptainFlint
Joined: 14 Dec 2004 Posts: 6151 Location: Москва
|
(Separately) Posted: Mon Oct 08, 2007 12:34 Post subject: |
|
|
Моторокер wrote: | Почему не должен и почему при их использовании всё работает? |
Работает, пока не попробуешь открыть два файла одновременно (в разных окнах Lister'а). _________________ Почему же, ё-моё, ты нигде не пишешь "ё"? |
|
Back to top |
|
|
Моторокер
Joined: 06 May 2005 Posts: 1517 Location: г. Пермь (читается Перьмь)
|
(Separately) Posted: Mon Oct 08, 2007 13:00 Post subject: |
|
|
А применительно к архиваторным плагинам?
А к контентным?
Вот допустим, чтобы выдать значение поля, надо долго грузить файл, долго рассчитывать значение. Второе поле высчитывается почти так же – та же загрузка, возможно, даже значение можно высчитать по первому полю. Где для ускорения работы хранить в памяти файл, как не в глобальной переменной? Или единственный вариант – заново загружать файл? _________________ плагины для Total Commander, статьи Graphics Converter; NSCopy; SEO HTML; KillOK; Плагин на Delphi
ПармаСруб - строительство домов и бань в Перми |
|
Back to top |
|
|
CaptainFlint
Joined: 14 Dec 2004 Posts: 6151 Location: Москва
|
(Separately) Posted: Mon Oct 08, 2007 13:31 Post subject: |
|
|
Моторокер wrote: | А применительно к архиваторным плагинам?
А к контентным? |
А к ним такого предупреждения я и не встречал, только к WLX.
Моторокер wrote: | Где для ускорения работы хранить в памяти файл, как не в глобальной переменной? |
Можешь хранить в глобальной, просто имей в виду, что глобальная переменная - она одна-единственная на весь программный код Тотала, общая на всё пространство процесса, включая все загруженные плагины. Проблема здесь только в том, что когда работаешь одновременно с двумя файлами в Lister'е, глобальная переменная будет у них общая. Поменяешь в одном окне - она поменяется и в другом. Это всё понятно и очевидно, когда уже знаешь, в чём дело, но для новичков это может стать неожиданностью - разрабатывая отдельные программы, привыкаешь к мысли, что всё содержимое твоего кода используется только и исключительно одной копией программы. При разработке DLL эта концепция становится ошибочной, поэтому Гислер и вписал такое предупреждение в справку.
Если очень хочется хранить что-то в глобальных переменных - никто не запрещает этого делать, просто надо подходить к этому с умом. Например, держать не просто данные о файле (ведь файл будет каждый раз другим), а хэш-таблицу, где эти данные привязаны к полному имени файла. Ну или хранить общие настройки плагина (только не забывать о синхронизации потоков). _________________ Почему же, ё-моё, ты нигде не пишешь "ё"? |
|
Back to top |
|
|
VadiMGP
Joined: 21 Mar 2007 Posts: 1625
|
(Separately) Posted: Mon Oct 08, 2007 14:26 Post subject: |
|
|
Моторокер wrote: | А к контентным? | Контентные плагины могут вызываться из разных потоков, поэтому к ним предъявляются требования потокобезопасности. Глобальные переменные являются, в этом смысле, потенциальным источником опасности.
В файловых плагинах тоже появились функции (для вируальных панелей), вызываемые из разных потоков.
А в общем, подписуюсь CaptainFlint wrote: | Если очень хочется хранить что-то в глобальных переменных - никто не запрещает этого делать, просто надо подходить к этому с умом. |
|
|
Back to top |
|
|
mutex
Joined: 16 Dec 2004 Posts: 134 Location: Казахстан
|
(Separately) Posted: Mon Oct 08, 2007 19:34 Post subject: |
|
|
Quote: | Почему не должен и почему при их использовании всё работает? |
Флинт ответил наглядно!
Точный ответ: память библиотеки разделяется всеми потоками приложения, включая ее код. _________________ E.Savich
http://www.xbaseview.com |
|
Back to top |
|
|
Моторокер
Joined: 06 May 2005 Posts: 1517 Location: г. Пермь (читается Перьмь)
|
(Separately) Posted: Wed Oct 10, 2007 10:25 Post subject: |
|
|
CaptainFlint wrote: | Моторокер wrote: | А применительно к архиваторным плагинам?
А к контентным? |
А к ним такого предупреждения я и не встречал, только к WLX. |
т.е. это и является сдерживающим фактором внедрения фонового поиска? _________________ плагины для Total Commander, статьи Graphics Converter; NSCopy; SEO HTML; KillOK; Плагин на Delphi
ПармаСруб - строительство домов и бань в Перми |
|
Back to top |
|
|
CaptainFlint
Joined: 14 Dec 2004 Posts: 6151 Location: Москва
|
(Separately) Posted: Wed Oct 10, 2007 14:57 Post subject: |
|
|
Моторокер wrote: | т.е. это и является сдерживающим фактором внедрения фонового поиска? |
Да. Причём не столько плагины, сколько unrar.dll (по заверениям Гислера), на основе которого и был составлен плагиновый API. _________________ Почему же, ё-моё, ты нигде не пишешь "ё"? |
|
Back to top |
|
|
|