Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

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

 
Post new topic   Reply to topic    Total Commander Forum Index -> Написание плагинов для Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
Моторокер



Joined: 06 May 2005
Posts: 1517
Location: г. Пермь (читается Перьмь)

Post (Separately) Posted: Mon Oct 08, 2007 11:19    Post subject: Плагин не должен использовать глобальные переменные Reply with quote

В статье
Листер плагин на 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
View user's profile Send private message
CaptainFlint



Joined: 14 Dec 2004
Posts: 6151
Location: Москва

Post (Separately) Posted: Mon Oct 08, 2007 12:34    Post subject: Reply with quote

Моторокер wrote:
Почему не должен и почему при их использовании всё работает?

Работает, пока не попробуешь открыть два файла одновременно (в разных окнах Lister'а).
_________________
Почему же, ё-моё, ты нигде не пишешь "ё"?
Back to top
View user's profile Send private message
Моторокер



Joined: 06 May 2005
Posts: 1517
Location: г. Пермь (читается Перьмь)

Post (Separately) Posted: Mon Oct 08, 2007 13:00    Post subject: Reply with quote

А применительно к архиваторным плагинам?
А к контентным?
Вот допустим, чтобы выдать значение поля, надо долго грузить файл, долго рассчитывать значение. Второе поле высчитывается почти так же – та же загрузка, возможно, даже значение можно высчитать по первому полю. Где для ускорения работы хранить в памяти файл, как не в глобальной переменной? Или единственный вариант – заново загружать файл?
_________________
плагины для Total Commander, статьи Graphics Converter; NSCopy; SEO HTML; KillOK; Плагин на Delphi
ПармаСруб - строительство домов и бань в Перми
Back to top
View user's profile Send private message
CaptainFlint



Joined: 14 Dec 2004
Posts: 6151
Location: Москва

Post (Separately) Posted: Mon Oct 08, 2007 13:31    Post subject: Reply with quote

Моторокер wrote:
А применительно к архиваторным плагинам?
А к контентным?

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

Моторокер wrote:
Где для ускорения работы хранить в памяти файл, как не в глобальной переменной?

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

Если очень хочется хранить что-то в глобальных переменных - никто не запрещает этого делать, просто надо подходить к этому с умом. Например, держать не просто данные о файле (ведь файл будет каждый раз другим), а хэш-таблицу, где эти данные привязаны к полному имени файла. Ну или хранить общие настройки плагина (только не забывать о синхронизации потоков).
_________________
Почему же, ё-моё, ты нигде не пишешь "ё"?
Back to top
View user's profile Send private message
VadiMGP



Joined: 21 Mar 2007
Posts: 1625

Post (Separately) Posted: Mon Oct 08, 2007 14:26    Post subject: Reply with quote

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

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

А в общем, подписуюсь
CaptainFlint wrote:
Если очень хочется хранить что-то в глобальных переменных - никто не запрещает этого делать, просто надо подходить к этому с умом.
Back to top
View user's profile Send private message
mutex



Joined: 16 Dec 2004
Posts: 134
Location: Казахстан

Post (Separately) Posted: Mon Oct 08, 2007 19:34    Post subject: Reply with quote

Quote:
Почему не должен и почему при их использовании всё работает?

Флинт ответил наглядно!
Точный ответ: память библиотеки разделяется всеми потоками приложения, включая ее код.
_________________
E.Savich
http://www.xbaseview.com
Back to top
View user's profile Send private message
Моторокер



Joined: 06 May 2005
Posts: 1517
Location: г. Пермь (читается Перьмь)

Post (Separately) Posted: Wed Oct 10, 2007 10:25    Post subject: Reply with quote

CaptainFlint wrote:
Моторокер wrote:
А применительно к архиваторным плагинам?
А к контентным?

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

т.е. это и является сдерживающим фактором внедрения фонового поиска?
_________________
плагины для Total Commander, статьи Graphics Converter; NSCopy; SEO HTML; KillOK; Плагин на Delphi
ПармаСруб - строительство домов и бань в Перми
Back to top
View user's profile Send private message
CaptainFlint



Joined: 14 Dec 2004
Posts: 6151
Location: Москва

Post (Separately) Posted: Wed Oct 10, 2007 14:57    Post subject: Reply with quote

Моторокер wrote:
т.е. это и является сдерживающим фактором внедрения фонового поиска?

Да. Причём не столько плагины, сколько unrar.dll (по заверениям Гислера), на основе которого и был составлен плагиновый API.
_________________
Почему же, ё-моё, ты нигде не пишешь "ё"?
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Написание плагинов для Total Commander All times are GMT + 4 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group