DLLs
13 отговора
182 прегледа
DLLs
Глобалните променливи в dll са глобални само за 1 процес.
Ако 2-ри процес вземе dll-a, за него се алокира нов хийп и съответно глобалните променливи се ресетират.
Т.е. в един dll глобални на практика са само функциите, променливите са локални за всеки процес.
Ще да имам глобална променлива за всички процеси.
Някой знае ли как?
Ако 2-ри процес вземе dll-a, за него се алокира нов хийп и съответно глобалните променливи се ресетират.
Т.е. в един dll глобални на практика са само функциите, променливите са локални за всеки процес.
Ще да имам глобална променлива за всички процеси.
Някой знае ли как?
Отг: DLLs
Имам една добра и една лоша новина :-)
Добрата, е че нишково базираните процеси могат да поделят глобални променливи в dll, което е и основната им цел освен да печаташ или търсиш нещо докато user-а си работи. За мен това най-убийствената комбинация dll+threads+file-mapped обекти, но и трите са така грубо похитени от страна на Micro$oft, че идваме и до лошата новина, а тя е че ако нямаш основателна причина по-добре избягвай нишките, защото освен, че са като Брус Уилис в "Умирай трудно", за дебъгване са и кофти за синхронизиране.
...may the source be with you :-)
Добрата, е че нишково базираните процеси могат да поделят глобални променливи в dll, което е и основната им цел освен да печаташ или търсиш нещо докато user-а си работи. За мен това най-убийствената комбинация dll+threads+file-mapped обекти, но и трите са така грубо похитени от страна на Micro$oft, че идваме и до лошата новина, а тя е че ако нямаш основателна причина по-добре избягвай нишките, защото освен, че са като Брус Уилис в "Умирай трудно", за дебъгване са и кофти за синхронизиране.
...may the source be with you :-)
Отг: DLLs
баси, струва ми се ултра-тъпо променливите да се предават през shared memory (mapped files)
Отг: DLLs
Не е задължително да ползваш mapped files, само казвам, че страхотна комбинация, инак нишките могат да поделят съвсем простичко глобални промелниви, само че синхронизацията между тях е като да наливаш в пробита кофа. Ако смея да те посъветвам, инвестирай повече в мислене как точно да бъде архитектурата, самото писане е почти елементарно, за да нямаш бели коси при дебъгването. И обърни внимание, трябва да прецениш всяка нишка кога ще се стартира, кога ще влиза в почивка и кога ще я пребиваш, сиреч terminate-ваш и всичкото това съчетано с синхорнизирани движения около глобалните променливи. Съветвам те също в краен случай да поделяш с глобални променливи. Добра техника според мен е за всяка поделена променлива да си направиш Get и Set функция - основна замисъл в капсулирането на данни и полиморфизма :-)
Успех!
Успех!
не
Задълбаваш твърде много, а на мен ми трябва нещо просто - а именно reference counter за dll-a.
Отг: не, ама да :-)
Ми точно де, правиш брояча в отделна нишка и синхронизираш отговора с извикващата функция, десет реда не повече...на какво пишеш ?
Отг: чудесно
Току що приключих проект, който имаше същия проблем, тъй, че повярвай не се изказвам неподготвен :-)
Отгоре на това брояча трябваше да е в час и с толкова променливо нещо каквото е tcp/ip комуникацията :-)
Опитвам се да ти помогна, но с тази твоя злонамереност, едва ли ще получиш сорсове както мислех да направя :-)
До нови срещи :-)
Отгоре на това брояча трябваше да е в час и с толкова променливо нещо каквото е tcp/ip комуникацията :-)
Опитвам се да ти помогна, но с тази твоя злонамереност, едва ли ще получиш сорсове както мислех да направя :-)
До нови срещи :-)
еврика
Както се казва, който търси - намира.
Това, което ми трябваше се нарича shared data section. За тези, на които може да им потрябва:
секциите се дефинират така:
#pragma data_seg(".shared")
int iSharedVar = 0;
#pragma data_seg()
После линкера трябва да се пуска с опция
/SECTION:.shared
За повече информация, пуснете си MSDN библиотеката и пуснете един search на "HOWTO: Specify Shared and Nonshared Data"
Това, което ми трябваше се нарича shared data section. За тези, на които може да им потрябва:
секциите се дефинират така:
#pragma data_seg(".shared")
int iSharedVar = 0;
#pragma data_seg()
После линкера трябва да се пуска с опция
/SECTION:.shared
За повече информация, пуснете си MSDN библиотеката и пуснете един search на "HOWTO: Specify Shared and Nonshared Data"
Малко по-различен въпрос
Ти хубаво викаш еврика, ама да те питам нещо за DLL-ите. Виждам че сте в час с материяла и сигурно ще можете да ме посъветвате нещо. Проблема ми е следния. На Win2000 имам зареден неговия си WEB сървър и съответно си пиша ISAPI приложения. Обаче когато тествам DLL-а от WEB страницата, какъв отговор ще ми върне, той си остава резидентен. Дотук добре, ама ако реша да променя нещо в програмката и прекомпилирам наново, после немога да копирам новия DLL върху стария във Script директорията понеже вече същия се ползва. Ако знаете кажете ми как да махна DLL-а от паметта или се налага да рестартирам WEB сървъра.
Отг: Малко по-различен въпрос
Най-добре рестартирай WEB server-а. Ако се напънеш сигурно ще измислиш и други начини, но този е най-чистия. :-)))
Ако цялата тази работа
ти трябва за да реализираш един брояч - по добре използвай семафор - по лесно е и е тред-сейв :-)
Ами...
Аз действах по следния начин:
Пускаш Computer Managment и отиваш на services/IIS
Там пускаш properties на default web site.
После отиваш на таб-а Home Directory.
Tам има секция Application Settings, на която има бутон Unload. Натискаш го, и dll-a се разкарва.
Този диалог може да си седи без да го затваряш и само да си натискаш Unload копчето. Ако откриеш каква функционалност има зад него - евала, ще си улесниш живота :)
Пускаш Computer Managment и отиваш на services/IIS
Там пускаш properties на default web site.
После отиваш на таб-а Home Directory.
Tам има секция Application Settings, на която има бутон Unload. Натискаш го, и dll-a се разкарва.
Този диалог може да си седи без да го затваряш и само да си натискаш Unload копчето. Ако откриеш каква функционалност има зад него - евала, ще си улесниш живота :)