DLLs

13 отговора 182 прегледа
#1

DLLs

Глобалните променливи в dll са глобални само за 1 процес.
Ако 2-ри процес вземе dll-a, за него се алокира нов хийп и съответно глобалните променливи се ресетират.
Т.е. в един dll глобални на практика са само функциите, променливите са локални за всеки процес.

Ще да имам глобална променлива за всички процеси.
Някой знае ли как?

Отговор
в отговор на МиГ-31 #2

Отг: DLLs

Имам една добра и една лоша новина :-)
Добрата, е че нишково базираните процеси могат да поделят глобални променливи в dll, което е и основната им цел освен да печаташ или търсиш нещо докато user-а си работи. За мен това най-убийствената комбинация dll+threads+file-mapped обекти, но и трите са така грубо похитени от страна на Micro$oft, че идваме и до лошата новина, а тя е че ако нямаш основателна причина по-добре избягвай нишките, защото освен, че са като Брус Уилис в "Умирай трудно", за дебъгване са и кофти за синхронизиране.

...may the source be with you :-)

Отговор
в отговор на Маниту #3

Отг: DLLs

баси, струва ми се ултра-тъпо променливите да се предават през shared memory (mapped files)

Отговор
в отговор на МиГ-31 #4

Отг: DLLs

Не е задължително да ползваш mapped files, само казвам, че страхотна комбинация, инак нишките могат да поделят съвсем простичко глобални промелниви, само че синхронизацията между тях е като да наливаш в пробита кофа. Ако смея да те посъветвам, инвестирай повече в мислене как точно да бъде архитектурата, самото писане е почти елементарно, за да нямаш бели коси при дебъгването. И обърни внимание, трябва да прецениш всяка нишка кога ще се стартира, кога ще влиза в почивка и кога ще я пребиваш, сиреч terminate-ваш и всичкото това съчетано с синхорнизирани движения около глобалните променливи. Съветвам те също в краен случай да поделяш с глобални променливи. Добра техника според мен е за всяка поделена променлива да си направиш Get и Set функция - основна замисъл в капсулирането на данни и полиморфизма :-)
Успех!

Отговор
в отговор на Маниту #5

не

Задълбаваш твърде много, а на мен ми трябва нещо просто - а именно reference counter за dll-a.

Отговор
в отговор на МиГ-31 #6

Отг: не, ама да :-)

Ми точно де, правиш брояча в отделна нишка и синхронизираш отговора с извикващата функция, десет реда не повече...на какво пишеш ?

Отговор
в отговор на Маниту #7

чудесно

и как би могло да стане?
мисли малко, преди да кажеш/напишеш нещо

Отговор
в отговор на МиГ-31 #8

Отг: чудесно

Току що приключих проект, който имаше същия проблем, тъй, че повярвай не се изказвам неподготвен :-)
Отгоре на това брояча трябваше да е в час и с толкова променливо нещо каквото е tcp/ip комуникацията :-)
Опитвам се да ти помогна, но с тази твоя злонамереност, едва ли ще получиш сорсове както мислех да направя :-)
До нови срещи :-)

Отговор
в отговор на МиГ-31 #9

еврика

Както се казва, който търси - намира.
Това, което ми трябваше се нарича shared data section. За тези, на които може да им потрябва:
секциите се дефинират така:

#pragma data_seg(".shared")
int iSharedVar = 0;
#pragma data_seg()

После линкера трябва да се пуска с опция
/SECTION:.shared

За повече информация, пуснете си MSDN библиотеката и пуснете един search на "HOWTO: Specify Shared and Nonshared Data"



Отговор
в отговор на МиГ-31 #10

Малко по-различен въпрос

Ти хубаво викаш еврика, ама да те питам нещо за DLL-ите. Виждам че сте в час с материяла и сигурно ще можете да ме посъветвате нещо. Проблема ми е следния. На Win2000 имам зареден неговия си WEB сървър и съответно си пиша ISAPI приложения. Обаче когато тествам DLL-а от WEB страницата, какъв отговор ще ми върне, той си остава резидентен. Дотук добре, ама ако реша да променя нещо в програмката и прекомпилирам наново, после немога да копирам новия DLL върху стария във Script директорията понеже вече същия се ползва. Ако знаете кажете ми как да махна DLL-а от паметта или се налага да рестартирам WEB сървъра.


Отговор
в отговор на Tonimir #11

Отг: Малко по-различен въпрос

Най-добре рестартирай WEB server-а. Ако се напънеш сигурно ще измислиш и други начини, но този е най-чистия. :-)))

Отговор
в отговор на МиГ-31 #12

Ако цялата тази работа

ти трябва за да реализираш един брояч - по добре използвай семафор - по лесно е и е тред-сейв :-)

Отговор
в отговор на Tonimir #13

Ами...

Аз действах по следния начин:
Пускаш Computer Managment и отиваш на services/IIS
Там пускаш properties на default web site.
После отиваш на таб-а Home Directory.
Tам има секция Application Settings, на която има бутон Unload. Натискаш го, и dll-a се разкарва.
Този диалог може да си седи без да го затваряш и само да си натискаш Unload копчето. Ако откриеш каква функционалност има зад него - евала, ще си улесниш живота :)

Отговор
в отговор на МиГ-31 #14

Отг: Ами...

Благодаря за съвета, наистина ми се улеснява живота.

Отговор