Здравствуйте, гость ( Вход | Регистрация )
Алексей1153 | Дата 24.2.2012, 8:36 |
после определенного времени работы заканчиваются дескрипторы (или как их там), отвечающие на выделение графических ресурсов в Windows, и программа зависает. Приходится перезапускать. не освобождаются хендлы контекста устройства (по-дельфийски контекст обозван "канвой") , шрифтов, битмапов и т.д. Это надо перетряхнуть код рисования и расставить вызовы освобождения сооттветствующих ресурсов там, где это не сделано. Как выцепить? 1) для начала запускаешь программу в обычном режиме. Открываешь диспетчер задач, показываешь там в процессах колонку "дескрипторы" и "объекты GDI". При перерисовках графики эти числа будут расти для процесса программы (и это есть неправильно) 2) комментируешь весь код отрисовки. Запускаешь. В диспетчере счётчики должны остановиться на определённом среднем значении (если проблема именно в коде отрисовки, возможно не только там. По интенсивности изменения счётчиков это можно определить) 3) потихоньку открывать графику и вносить исправления если до кода нет доступа, то для уменьшения частоты падений не следует по окну программы возить другими окнами - лучше просто сворачивать окно программы в таск бар, когда оно не нужно Влад, ну, начнём с того, что проще было в бинарник писать, а не ascii ) Раз уж такая пьянка. Ну а рубить - это да. Сначала рубить, потом научить правильно ))) |
|
Влад | Дата 23.2.2012, 11:00 |
.... я бы того программиста, который так сохраняет в ini.... Работать уборщицей! Пожизненно!! Я думаю, рубить сплеча не следует - мы же не знаем, какие основания были у программиста сохранять именно так, а не иначе.... А вот тот факт, что эти самые основания никак не отражены в проектной документации (а есть ли вообще проектная документация?) - это явный косяк, за который нужно как минимум завоспитывать до слез. Причем скорее всего не программиста-кодера, а архитекта, который либо придумал эту "фичу" и никак не описал, почему, либо допустил в этом отношении самодеятельность программиста без всяких видимых оснований. Ну и если заканчиваются дескрипторы - это тоже косяк, причем тут воспитывать нужно уже QA, тестеров и менеджера проекта.... |
|
novichkov | Дата 22.2.2012, 19:42 |
novichkov, я бы того программиста, который так сохраняет в ini.... Работать уборщицей! Пожизненно!! А еще в этой программе, написанной, кстати, в Delphi, после определенного времени работы заканчиваются дескрипторы (или как их там), отвечающие на выделение графических ресурсов в Windows, и программа зависает. Приходится перезапускать. |
|
Алексей1153 | Дата 22.2.2012, 19:34 |
novichkov, я бы того программиста, который так сохраняет в ini.... Работать уборщицей! Пожизненно!! | |
novichkov | Дата 22.2.2012, 17:46 |
Да, так значительно проще Сделал так:
|
|
Влад | Дата 22.2.2012, 16:52 |
Тебе нужно просто интерпретировать последовательность байтов как значение другого типа.
|
|
novichkov | Дата 22.2.2012, 14:59 |
Сейчас сделал такую версию: double hextodouble(const QString &hex) { double result=0.0l; QByteArray ba; QDataStream stream(&ba, QIODevice::WriteOnly); for (int i=0; i<16; i+=2) { quint8 c = hex.mid(i,2).toUInt(0,16); stream<<c; } QDataStream stream1(&ba, QIODevice::ReadOnly); stream1 >> result; return result; } Но она слишком тяжеловесна. |
|
novichkov | Дата 22.2.2012, 14:00 |
Знатоки низкоуровневых функций C/C++! Помогите, пожалуйста, решить проблему. В одной не очень хорошо написанной программе в файлы описаний данных, которые представляют собой простые ini файлы, разработчик программы пишет действительные параметры в виде AmplLevel=(0BC0000000000000) <- строковое представление числа в формате double XStep=(00000000) <- строковое представление числа в формате float Мне нужно декодировать эти строки, то есть получить соответствующие значения параметров. Для float решение простое: char *hex_string = .... float f; sscanf(hex_string,"%x",&f); А вот для double это не работает. Подскажите, как можно переконвертировать строку, чтобы получить нужный результат? Для справки: 0x 3ff0 0000 0000 0000 = 1 0x 3ff0 0000 0000 0001 ≈ 1.0000000000000002, the next higher number > 1 0x 3ff0 0000 0000 0002 ≈ 1.0000000000000004 0x 4000 0000 0000 0000 = 2 0x c000 0000 0000 0000 = –2 0x3fd5 5555 5555 5555 = 0.333333333333333314829616256247390992939472198486328125 |
|
Просмотр темы полностью (откроется в новом окне) | |
Текстовая версия | Сейчас: 29.4.2024, 17:59 |