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

Только для тех, кто пишет плагины под Total Commander. Обмен опытом, решение проблем.

Модераторы: d-view, Моторокер, Avada, CaptainFlint, Nik

Ответить
Аватара пользователя
Моторокер
Сообщения: 1517
Зарегистрирован: Пт май 06, 2005 08:22
Откуда: г. Пермь (читается Перьмь)
Контактная информация:

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

Сообщение Моторокер »

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

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

var fmMain: TfmMain;

Замечание: ПЛАГИН НЕ ДОЛЖЕН ИСПОЛЬЗОВАТЬ ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ!
Почему не должен и почему при их использовании всё работает?
плагины для Total Commander, статьи Graphics Converter; NSCopy; SEO HTML; KillOK; Плагин на Delphi
ПармаСруб - строительство домов и бань в Перми
Аватара пользователя
CaptainFlint
Сообщения: 6239
Зарегистрирован: Вт дек 14, 2004 22:34
Контактная информация:

Сообщение CaptainFlint »

Моторокер писал(а):Почему не должен и почему при их использовании всё работает?
Работает, пока не попробуешь открыть два файла одновременно (в разных окнах Lister'а).
Почему же, ё-моё, ты нигде не пишешь "ё"?
Аватара пользователя
Моторокер
Сообщения: 1517
Зарегистрирован: Пт май 06, 2005 08:22
Откуда: г. Пермь (читается Перьмь)
Контактная информация:

Сообщение Моторокер »

А применительно к архиваторным плагинам?
А к контентным?
Вот допустим, чтобы выдать значение поля, надо долго грузить файл, долго рассчитывать значение. Второе поле высчитывается почти так же – та же загрузка, возможно, даже значение можно высчитать по первому полю. Где для ускорения работы хранить в памяти файл, как не в глобальной переменной? Или единственный вариант – заново загружать файл?
плагины для Total Commander, статьи Graphics Converter; NSCopy; SEO HTML; KillOK; Плагин на Delphi
ПармаСруб - строительство домов и бань в Перми
Аватара пользователя
CaptainFlint
Сообщения: 6239
Зарегистрирован: Вт дек 14, 2004 22:34
Контактная информация:

Сообщение CaptainFlint »

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

Если очень хочется хранить что-то в глобальных переменных - никто не запрещает этого делать, просто надо подходить к этому с умом. Например, держать не просто данные о файле (ведь файл будет каждый раз другим), а хэш-таблицу, где эти данные привязаны к полному имени файла. Ну или хранить общие настройки плагина (только не забывать о синхронизации потоков).
Почему же, ё-моё, ты нигде не пишешь "ё"?
VadiMGP
Сообщения: 1625
Зарегистрирован: Ср мар 21, 2007 20:58

Сообщение VadiMGP »

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

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

А в общем, подписуюсь
CaptainFlint писал(а):Если очень хочется хранить что-то в глобальных переменных - никто не запрещает этого делать, просто надо подходить к этому с умом.
mutex
Сообщения: 134
Зарегистрирован: Чт дек 16, 2004 15:48
Откуда: Казахстан
Контактная информация:

Сообщение mutex »

Почему не должен и почему при их использовании всё работает?
Флинт ответил наглядно!
Точный ответ: память библиотеки разделяется всеми потоками приложения, включая ее код.
Аватара пользователя
Моторокер
Сообщения: 1517
Зарегистрирован: Пт май 06, 2005 08:22
Откуда: г. Пермь (читается Перьмь)
Контактная информация:

Сообщение Моторокер »

CaptainFlint писал(а):
Моторокер писал(а):А применительно к архиваторным плагинам?
А к контентным?
А к ним такого предупреждения я и не встречал, только к WLX.
т.е. это и является сдерживающим фактором внедрения фонового поиска?
плагины для Total Commander, статьи Graphics Converter; NSCopy; SEO HTML; KillOK; Плагин на Delphi
ПармаСруб - строительство домов и бань в Перми
Аватара пользователя
CaptainFlint
Сообщения: 6239
Зарегистрирован: Вт дек 14, 2004 22:34
Контактная информация:

Сообщение CaptainFlint »

Моторокер писал(а):т.е. это и является сдерживающим фактором внедрения фонового поиска?
Да. Причём не столько плагины, сколько unrar.dll (по заверениям Гислера), на основе которого и был составлен плагиновый API.
Почему же, ё-моё, ты нигде не пишешь "ё"?
Ответить