Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2002.06.10;
Скачать: [xml.tar.bz2];

Вниз

О контекстах   Найти похожие ветки 

 
SPeller   (2002-04-05 13:07) [0]

У меня возник вот вопрос. Многие читали в документаци по API о том, что перед удалением контекста сначала его надо восстановить, т.е восстановить все изначально выбранные в нём объекты. Так вот, зачем это делается и какие последствия может иметь удаление контекста без восстановления в нём исходных объектов ??


 
VuDZ   (2002-04-05 13:37) [1]

пример, если правильно понял:

HDC hDC = someDC;
HPEN hPen = CreatePen(...);
SelectObject(hCD, hPen);


и так, первое:
MSDN: An application should always replace a new object with the original, default object after it has finished drawing with the new object.
второе: ресурсы GDI являются ресурсами ядра, но в отличие от HANDLE типа Event, Semaphore & etc., освобождение указателя на них не освобождает сами ресурсы. Если мне не изменяет память, то этот момент немного освещён у Mark Russinovich и David Solomon в Inside MS win2k.
Не освобождение ресурсов привод к невозможности нового их выделения, а строки типа:

HPEN oldPen = SelectObject(...);
...
SelectObject(hDC, oldPen);

и пр. в таком же духе возвращает некому DC его "родной" объект, и при уничтожение его [DC] он может быть безболезнено удалён для системы.


Let"s say that you forget to call CloseHandle—will there be a memory leak? Well, yes and no. It is possible for a process to leak resources (such as kernel objects) while the process runs. However, when the process terminates, the operating system ensures that any and all resources used by the process are freed—this is guaranteed. For kernel objects, the system performs the following actions: When your process terminates, the system automatically scans the process"s handle table. If the table has any valid entries (objects that you didn"t close before terminating), the system closes these object handles for you. If the usage count of any of these objects goes to zero, the kernel destroys the object.


Однако, система не может сделать то же самое для GDI ресурсов, скорее всего из-за того, что из одного приложения можно управлять DC другого.


 
SPeller   (2002-04-05 13:42) [2]

Тоесть, если я удалю контекст DeleteDC и созданные мною для него объекты DeleteObject, то моя прога всё равно будет ресурсы потихоньку поедать ?


 
VuDZ   (2002-04-05 13:45) [3]

да, т.ею. сначала делаешь SelectObject() обратный, а потом только DeleteDC() & DeleteObject()


 
SPeller   (2002-04-05 13:48) [4]

Или RestoreDC оно ведь тоже для этих целей ?


 
VuDZ   (2002-04-05 14:27) [5]

SaveDC,
RestoreDC
The RestoreDC function restores a device context (DC) to the specified state. The DC is restored by popping state information off a stack created by earlier calls to the SaveDC function.

BOOL RestoreDC(
HDC hdc, // handle to DC
int nSavedDC // restore state
);

Parameters
hdc
[in] Handle to the DC.
nSavedDC
[in] Specifies the saved state to be restored. If this parameter is positive, nSavedDC represents a specific instance of the state to be restored. If this parameter is negative, nSavedDC represents an instance relative to the current state. For example, –1 restores the most recently saved state.


 
SPeller   (2002-04-05 14:47) [6]

>VuDZ © (05.04.02 14:27)

Рашифруйте на русский этот кусок, а то я не понимаю..

Specifies the saved state to be restored. If this parameter is positive, nSavedDC represents a specific instance of the state to be restored. If this parameter is negative, nSavedDC represents an instance relative to the current state. For example, –1 restores the most recently saved state.


 
SPeller   (2002-04-05 15:16) [7]

Запись RestoreDC(hDC,-1) восстановит состояние контекста до предыдущего, сохранённого SaveDC. Я правильно понял ??


 
VuDZ   (2002-04-05 16:34) [8]

the most recently saved state == наиболее часто сохраняемый state :>
Но это не востанавливает вси HGDIOBJETs


 
Sergey_n   (2002-04-07 01:07) [9]

Пожирание ресурсов при неправильном удалении будет только под 95/98/ME, а под 2k/XP нормально.


 
SPeller   (2002-04-07 03:01) [10]

Sergey_n © (07.04.02 01:07) так у меня Ме и стоит


 
SPeller   (2002-04-07 06:43) [11]

А RestoreDC(hDC,1) восстановит предыдущее состояние ??


 
VuDZ   (2002-04-07 18:26) [12]


> Пожирание ресурсов при неправильном удалении будет только
> под 95/98/ME, а под 2k/XP нормально.

будут, будет... под НТ их больше, но они не безграничны


> А RestoreDC(hDC,1) восстановит предыдущее состояние ??

слушай, а вот написать примерчик простой на 100 строк кода сложно? или под Делфи уже нельзя создавать проекты с чистым API?


 
SPeller   (2002-04-08 02:18) [13]

VuDZ © (07.04.02 18:26)
О чём это вы ?


 
VuDZ   (2002-04-08 13:29) [14]

о том, что проще написать пример с RestoreDC() и самому увидеть что будеть, чем спрашивать других, имхо


 
SPeller   (2002-04-08 14:18) [15]

VuDZ © (08.04.02 13:29)
А как я увижу, правильно этот пример сработал или нет ? Там же не вылазит мессага, мол, "Ресурсы успешно освобождены !".


 
VuDZ   (2002-04-08 14:39) [16]

м...
попробуй запуситть это в бесконечном цикле, если церез пару минут индикатор свободных GDI ресурсов будет около нуля - RIP.
Но RestoreDC и не должен по идее востанавливать измнёные объекты...
У меня сейчас VC под рукой нет, так что ничего сказать не могу...



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2002.06.10;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.007 c
1-30782
allrussia
2002-05-30 04:37
2002.06.10
DiskSize, DiskFree - Integer не позволяет


6-30953
alexnsk
2002-04-02 07:56
2002.06.10
Как получить сообщение из почтового ящика


4-31058
Andrey-k
2002-04-06 12:30
2002.06.10
Использование CreateFile для открытия файла


3-30684
Malyatko
2002-05-17 17:28
2002.06.10
DBGrid <--> Excel.


1-30751
esVer
2002-05-28 15:31
2002.06.10
Русский язык в нерусской Windows





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский