Страница 1 из 1

Плагин не должен использовать глобальные переменные

Добавлено: Пн окт 08, 2007 11:19
Моторокер
В статье
Листер плагин на Borland Delphi 7 для начинающих
читаем
Evgeniy Savich писал(а):Надо добавить в проект форму, изменить ее имя на fmMain и сохранить модуль формы под именем unMain.pas. Эта форма и есть окно плагина.

В модуле unMain можно удалить бесполезную глобальную переменную:

var fmMain: TfmMain;

Замечание: ПЛАГИН НЕ ДОЛЖЕН ИСПОЛЬЗОВАТЬ ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ!
Почему не должен и почему при их использовании всё работает?

Добавлено: Пн окт 08, 2007 12:34
CaptainFlint
Моторокер писал(а):Почему не должен и почему при их использовании всё работает?
Работает, пока не попробуешь открыть два файла одновременно (в разных окнах Lister'а).

Добавлено: Пн окт 08, 2007 13:00
Моторокер
А применительно к архиваторным плагинам?
А к контентным?
Вот допустим, чтобы выдать значение поля, надо долго грузить файл, долго рассчитывать значение. Второе поле высчитывается почти так же – та же загрузка, возможно, даже значение можно высчитать по первому полю. Где для ускорения работы хранить в памяти файл, как не в глобальной переменной? Или единственный вариант – заново загружать файл?

Добавлено: Пн окт 08, 2007 13:31
CaptainFlint
Моторокер писал(а):А применительно к архиваторным плагинам?
А к контентным?
А к ним такого предупреждения я и не встречал, только к WLX.
Моторокер писал(а):Где для ускорения работы хранить в памяти файл, как не в глобальной переменной?
Можешь хранить в глобальной, просто имей в виду, что глобальная переменная - она одна-единственная на весь программный код Тотала, общая на всё пространство процесса, включая все загруженные плагины. Проблема здесь только в том, что когда работаешь одновременно с двумя файлами в Lister'е, глобальная переменная будет у них общая. Поменяешь в одном окне - она поменяется и в другом. Это всё понятно и очевидно, когда уже знаешь, в чём дело, но для новичков это может стать неожиданностью - разрабатывая отдельные программы, привыкаешь к мысли, что всё содержимое твоего кода используется только и исключительно одной копией программы. При разработке DLL эта концепция становится ошибочной, поэтому Гислер и вписал такое предупреждение в справку.

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

Добавлено: Пн окт 08, 2007 14:26
VadiMGP
Моторокер писал(а):А к контентным?
Контентные плагины могут вызываться из разных потоков, поэтому к ним предъявляются требования потокобезопасности. Глобальные переменные являются, в этом смысле, потенциальным источником опасности.

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

А в общем, подписуюсь
CaptainFlint писал(а):Если очень хочется хранить что-то в глобальных переменных - никто не запрещает этого делать, просто надо подходить к этому с умом.

Добавлено: Пн окт 08, 2007 19:34
mutex
Почему не должен и почему при их использовании всё работает?
Флинт ответил наглядно!
Точный ответ: память библиотеки разделяется всеми потоками приложения, включая ее код.

Добавлено: Ср окт 10, 2007 10:25
Моторокер
CaptainFlint писал(а):
Моторокер писал(а):А применительно к архиваторным плагинам?
А к контентным?
А к ним такого предупреждения я и не встречал, только к WLX.
т.е. это и является сдерживающим фактором внедрения фонового поиска?

Добавлено: Ср окт 10, 2007 14:57
CaptainFlint
Моторокер писал(а):т.е. это и является сдерживающим фактором внедрения фонового поиска?
Да. Причём не столько плагины, сколько unrar.dll (по заверениям Гислера), на основе которого и был составлен плагиновый API.