Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1] 2 3 4 ... 8   Вниз
  Печать  
Автор Тема: Эврика  (Прочитано 142410 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


WWW
« : 02-12-2004 19:49 » 

Вот такую тему я придумал -
иногда находишь решение какой-нибудь проблемки, этим хочется поделиться со всеми - вдруг кто тоже мучается, а то и ещё раньше решил и подскажет лучший вариант.
В статью такое не выливается, а иногда важная деталь например:
« Последнее редактирование: 29-11-2009 08:12 от Sel » Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


WWW
« Ответ #1 : 02-12-2004 19:59 » 

я знал, что если создаёшь

CDC dc;
, то его потом надо освобождать
ReleaseDC(&dc);

но оказывается если создал только указатель
CDC* dc;

то тоже надо
ReleaseDC(dc); //!!!!

причём под W98 это никак не заметно (Господи, до чего ладная системка, что бы про неё не говорили!) , а под XыPы - жрёт память безбожно. Особено если оно в обработчике таймера

-------------
кстати - побочный продукт этого "исследования" - моя программка MemorySpy, показывает озу в байтах (не в метрах, а именно в байтах) и в процентах и позволяет задать логический ноль, по которому видно, сколько съедает прога после запуска

если у ГРОМА появится время - высылаю Улыбаюсь . Или, как я понял МОРОЗ тоже может выкладывать - вышлю ему
Записан

vasyav
Гость
« Ответ #2 : 03-12-2004 08:15 » 

А не проще ли это завернуть в класс обвертку. Где деструктор сам вызовет ReleaseDC? Причем, если класс уже создан и дальше произойдет исключение, то он также освободит ресурс. Например:

try
{
    MyCDC dc;
    throw exception( "" );
} // Здесь автоматичеки вызовется деструктор
catch ( ... )
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


WWW
« Ответ #3 : 03-12-2004 08:52 » 

vasyav, ээээ... ты о чём ? Улыбаюсь
Не, классов городить не хоцца, в МАС и так нагорожено
Записан

baldr
Команда клуба

ru
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #4 : 03-12-2004 10:22 » 

Алексей1153, а если создаешь CPaintDC? Он в деструкторе не освобождается потом?
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #5 : 03-12-2004 14:40 » 

Алексей1153, Ты создаеш Дескриптор устройства. В добром старом Windows 3.11 можно было создавать не более 5 Дескрипторов одновременно на все приложения. Иначе Виндовс Вылетал со страшной силой. Помимо всех остальных параметров, там также хранится битовая карта экрана. Вот она и жрет ресурсы. А то, что ХР "жрет больше рессурсов под это дело". Скорее всего вопрос, где Виндовс хранит данные. В рабочей области программы, или в системной области. Но по любому практически одно и тоже пространство памяти.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


WWW
« Ответ #6 : 03-12-2004 19:25 » 

baldr, CPaintDC умеет сам удаляться. Он и есть вроде того класса, о котором упоминал vasyav

Finch, да я в курсе про насначение CDC Улыбаюсь , я же не о том! Почему когда я создаю ТОЛЬКО указатель - его тоже надо освобождать? вот это я не пойму.
Цитата

"жрет больше рессурсов под это дело"

- я такого не писал. Я написал, что под 98 - неосвобождение контекста не жрёт памяти ВООБЩЕ , а под ХР - очень, примерно 40000 байт в секунду (ну во всяком случае - в моей проге так получилось)
Записан

Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #7 : 04-12-2004 13:45 » 

Алексей1153, В справочниках по WinAPI, сколько я читал, рекомендуют закрывать как можно быстрее дескрипторы устройства, так как их количество тоже лимитировано (для Windows 95 около 32536 дескрипторов). Скорее всего ты в той функции которая висит на таймере все время создаеш новый дескриптор и не закрываеш его. В таких случаях я создавал глобальный дескриптор и использовал его. Потом в функции закрытия глобальных описателей удалял его. CDC и ReleaseDC это надстройки над WinAPI.
HDC определена в WinAPI как DWORD. В функциях GetDC и.т.п. Windows создает образ экрана и возрашает HDC.  После этого надо удалить этот образ из памяти.
Теперь вопрос как определна CDC в MFC? Судя по тому, что надо использовать ReleaseDC, в деструкторе CDC не определно уничтожение Дескриптора экрана. Вот у тебя и остаются хвосты.
В книге Рихтера упоминается разница для описателей процесса для 98 Виндовса и для МЕ. В 98 возрашается описатель как текушая позиция в таблице описателей. В МЕ как ссылка на область памяти. И я так думаю тоже самое действует и для дескрипторов устройства. И я так думаю в ХР образ экрана размешается в рабочей области программы.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


WWW
« Ответ #8 : 04-12-2004 18:05 » 

95 - ю я даже не щупал Улыбаюсь Только давно очень играл. В DOOM1 Отлично
Записан

Pu
Большой босс

ru
Offline Offline
78


« Ответ #9 : 04-12-2004 18:17 » 

Алексей1153, для этого достаточно было просто старого доброго доса. у мене почемуто все 9х прошли мимо. работать было просто невозможно. к програмированию под вин перешел только под nt4. была попытка под 98 но это закончилось очень быстро, после 20-30 переинсталяций системы за неделю.  Отлично
Записан

Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать.
(с) Артур Джонс
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


WWW
« Ответ #10 : 06-12-2004 19:11 » 

Pu, я и под досом гонял Улыбаюсь

*********************

а вот ещё один непонятк, который меня долго долбил:

если процедура во вьюхе вызывает UpdateData(BOOL), происходит известно что.

Но, еслти эту процедуру вызвали не из самой вьюхи, а например из потока, то происходит изумление виндовз. Причёт - я проследил - вылетает на проверке существования одного из объектов CWnd класса Улыбаюсь

заменил на

m_txt=newText;
//UpdateData(0);
GetDlgItem(IDC_edit)->SetWindowText(m_txt);

и всё зажило...

с чем такое связано?
Записан

baldr
Команда клуба

ru
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #11 : 07-12-2004 08:33 » 

Алексей1153, а ты объект явно указывай?
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


WWW
« Ответ #12 : 07-12-2004 09:15 » 

забыл добавить - падает только в дебаге

baldr, в смысле?
Записан

baldr
Команда клуба

ru
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #13 : 07-12-2004 09:33 » 

В смысле myCoolWndObject->UpdateData(0);
Ты же его вызывал не из самого объекта?
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


WWW
« Ответ #14 : 07-12-2004 18:20 » 

из самого.

вот пример:
Код:
void CView::Proc1()
{
   m_EditText="новый текст";
   UpdateData(0);
}
если вызывается из самой вьюхи, то всё нормально:
Код:
void CView::Proc2()
{
   Proc1();
}
а если из некого потока, то косяк:
Код:
DWORD TR(void* par)
{
   ((MyView*)par)->Proc1();
}

ломается на UpdateData(0) , причём только в дебаге (причина, почему только в дебаге - инициализация переменных по умолчанию разная - в дебаге 0xccccccccc, а в релизе - 0)
« Последнее редактирование: 02-12-2007 19:18 от Алексей1153++ » Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


WWW
« Ответ #15 : 11-12-2004 18:45 » 

я тут заметил, что компилятор не умеет двоичные числа воспринимать и сочинил такое:
Код:
/////////////////////////////////////////////////////////////////////
//двоичные числа
#define _b8(b) ((BYTE)(\
(b&0x10000000?0x80:0)|(b&0x01000000?0x40:0)|\
(b&0x00100000?0x20:0)|(b&0x00010000?0x10:0)|\
(b&0x00001000?0x08:0)|(b&0x00000100?0x04:0)|\
(b&0x00000010?0x02:0)|(b&0x00000001?0x01:0)))
#define _b16(b8H,b8L) ((WORD)((_b8(b8H)<<8)|_b8(b8L)))
#define __b16(b16) ((WORD)((_b8(((unsigned __int64)b16)>>32)<<8)|(_b8(b16))))
#define _b32(b8H,b8L,b8h,b8l) ((DWORD)(((_b16(b8H,b8L)<<16)|_b16(b8h,b8l))))
#define __b32(b16H,b16L) ((DWORD)(((__b16(b16H))<<16)|(__b16(b16L))))
//b8 == 0xbbbbbbbb
//b16 == 0xbbbbbbbbbbbbbbbb
//b ==( 1 || 0 )
//////////////////////////////////////////
зацените Улыбаюсь
« Последнее редактирование: 02-12-2007 19:20 от Алексей1153++ » Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


WWW
« Ответ #16 : 11-12-2004 18:54 » 

_b16 и __b16 - это разные варианты одного и того же, иногда удобнее то, иногда энто
_b32 и __b32 - аналогично.

0xbbbbbbbbbbbbbbbb - это HEX, цифра b - 1 или 0, соответственно двоичным разрядам

а юзать так:
Код:
DWORD www=0;
www=_b32(0x10101010,0x10101010,0x10101010,0x10101010);
www=_b32(0x01010101,0x01010101,0x01010101,0x01010101);
www=_b32(0x1,0x1,0x1,0x1);
www=__b16(0x1010101010101010);
www=__b16(0x0101010101010101);
www=__b32(0x1010101010101010,0x1010101010101010);
www=__b32(0x0101010101010101,0x0101010101010101);
www=__b32(0x11,0x11); //нет незначащих нулей
« Последнее редактирование: 02-12-2007 19:21 от Алексей1153++ » Записан

Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #17 : 03-04-2005 13:00 » 

Недавно ловил баги в одной программке. И наткнулся на следуюшее расхождение в спецификации С++. По спецификации: индекс массива это нуль или любое положительное целое число. Вижуале у меня получился индекс отрицательный. Причем  вижуал это скушал без проблем. Индекс был переменной. и на каком то этапе он приобрел отрицательное значение. И конечно массив не заполнялся должным образом. Отлично
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #18 : 03-04-2005 16:01 » 

Finch, он наверняка автоматически прокастился в положительное число, и видимо выхода за пределы массива не произошло. Я тоже как-то с таким сталкивался.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #19 : 03-04-2005 16:10 » 

Джон, я честно говоря не проверял память за пределами массива. Но сам массив неиницилизовался. т.е. запись в сам массив не произошло.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #20 : 03-04-2005 17:02 » 

Иногда в дебаг режиме происходят действительно интересные вещи, которые потом проявляются в релизе. Например, дебаггер всегда резервирует больше памяти чем надо. Тогда прокатывают такие вещи.
Например у тебя стоя две переменные:
   char ch[2];
   int i = 1;
проще говоря 2 байта + 4 байта подряд
   ch[2] = 0xFF;
   ch[3] = 0xFF;
   ch[4] = 0xFF;
   ch[5] = 0xFF;
прокатывает. Если же в релизе под инт будет выделен регистр, то ессно что эта вся преллесть вылетит нафиг.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #21 : 03-04-2005 18:38 » 

Наверное стоит создать темку "Баги - электронные жучки" (простите за плагиат) Улыбаюсь . И скидывать в нее все случаи из практики. Когда нас комп сильно удивил. Говорят же "Надо учится на чужих ошибках, чтобы своих делать еше больше"

« Последнее редактирование: 21-12-2007 13:06 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


WWW
« Ответ #22 : 03-12-2005 09:32 » 

долго бился над такой фигнёй: имеется некий макрос, неважно что содержащий

(пишу в VC++6)

Код:
#define myDEF \
int i=1;\
int j=0

и , казалось бы всё ок, да компилятор ругается Улыбаюсь
Не победил, пока не догадался включить отображение непечатных символов

оказывается была табуляция после "\" (вторая строка) и строка считалась оборванной (то же самое, если пробел )

спасло то, что по привычке не ставлю в конце макроса семиколон Улыбаюсь
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


WWW
« Ответ #23 : 23-12-2005 14:50 » 

насчёт корявости при копировании из студии в блокнот или в форум:

1)
&#240;&#243;&#241;&#241;&#234;&#232;&#233; &#242;&#229;&#234;&#241;&#242;
not russian text

2)
русский текст
not russian text


--------------------
короче, первый текст копировал в буфер при включенной английской раскладке,
второй - при русской Улыбаюсь Конец моим мучениям, закономерность доказана Улыбаюсь)
Записан

nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #24 : 23-12-2005 14:58 » 

Не понял, объясняй давай. Нашел возможность как копировать русский текст?
Записан

ещё один вопрос ...
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


WWW
« Ответ #25 : 23-12-2005 15:04 » 

так чего не понял?
в трее - язык выбираешь русски (ctrl+shift или как у кого)

только затем copy  - и paste уже нормальная Улыбаюсь
Записан

nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #26 : 23-12-2005 15:49 » 

теперь понял Улыбаюсь. Будет момент, обязательно проверю Улыбаюсь
Записан

ещё один вопрос ...
Mayk
Гость
« Ответ #27 : 30-12-2005 05:07 » 

Finch, он наверняка автоматически прокастился в положительное число, и видимо выхода за пределы массива не произошло. Я тоже как-то с таким сталкивался.
Отнюдь. Компилятор ничего не будет преобразовывать. Если он поддерживает стандарт конечно.
Код:
int a[10];
int* b =  &a[1];
b[-1] = 11;  //теперь a[0]= 11
Советую посмотреть исходники, сгенерированные всякими yacc'ами и bison'ами.
вот такоё вот примерно выражение:
Код:
expr '+' expr  {result=$1+$3;}
Бизон преобразовывал в что-то типа
Код:
result=expr[-1]+expr[1];
« Последнее редактирование: 02-12-2007 19:25 от Алексей1153++ » Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #28 : 13-10-2006 16:34 » 

Недавно в одном коде видел одну хитрость. Мне лично понравилась. Хотя есть и некоторые минусы.

Есть набор функций вида bool Function(........);. Нужно их поочередно вызвать. Если хоть одна функция возратит false, дальнейший вызов остальных функций не имеет смысла. Клаcсическое решение:
Код:
if (Func1(.....))
     if (Func2(......))
         if (Func3(.....))
...................................

То решение, которое я видел
Код:
if (Func1(...) && Func2(.....) && Func3(....) && .......);


Единственный минус я вижу: довольно сложно отменить результаты предыдуших действий.
« Последнее редактирование: 13-10-2006 16:37 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


WWW
« Ответ #29 : 13-10-2006 16:54 » 

Func1(...)?Func2(.....)?Func3(....):0:0;

а так если ? Улыбаюсь
« Последнее редактирование: 13-10-2006 17:01 от Алексей1153 » Записан

Страниц: [1] 2 3 4 ... 8   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines