Dmitry Develop
176 subscribers
77 photos
35 videos
88 files
205 links
Этот канал в основном будет интересен новичкам в программировании и людям немного поопытнее.
Здесь я буду делиться своими новостями и достижениями в программировании.

Разработка, программирование; c++, gcc, g++, gnu, mingw; winapi, windows; vscode.
Download Telegram
Хотел оптимизировать и облегчить перевод тактов в количество наносекунд при помощи QueryPerformanceCounter и QueryPerformanceFrequency.

Попробовал два способа перевести такты в секунды.

В моей системе прекрасно работают оба способа, но на другом компьютере при одинаковом количестве тактов из-за округления разница между двумя способами получилась в целых 200'000 наносекунд.

Предполагаю, чем больше количество тактов, чем выше будет разница.

ссылка на канал | ссылка на группу
Media is too big
VIEW IN TELEGRAM
Как же легко говнокодить, а потом тяжело переделывать по-нормальному).

В моей системе GUI при реализации slider, как отдельного компонента, я заметил несколько проблем.
У меня пока не реализовано такое понятие, как родительский и дочерний элемент.
Поэтому сразу не понял, почему slider не реагирует на курсор.

ссылка на канал | ссылка на группу
Media is too big
VIEW IN TELEGRAM
Ох, вот зачем я только решил рисовать графику при помощи GDI, это оказалось таким хардкором.
Благо я наконец-то нашёл!!
Нашёл, как рисовать внутри области, чтобы всё остальное, что выходит за её границы, отсекалось.

В opengl это решается за секунду (scissors), а вот решение для GDI я искал более недели.

В HTML это стиль overflow: hidden или scroll.

ссылка на канал | ссылка на группу
👍1
Какие ещё нужны элементы для графического интерфейса?

Думаю, пора переделывать GUI на компонентную систему + сделать древовидную структуру интерфейса.

ссылка на канал | ссылка на группу
Кто бы мог подумать, что физика становится настолько интересной, когда находишь ей применение на практике, а не думаешь о ней в скучной теории.

Всё ещё экспериментирую с QueryPerformanceCounter, разбираюсь с частотой и периодом, думаю, какие единицы измерения выбирать основными и как переводить такты во время и наоборот.

ссылка на канал | ссылка на группу
👍1
Вроде, с обёрткой над QueryPerformanceCounter разобрался.
Время получаю в наносекундах.

Замерил время, сколько по факту будет работать Sleep(1500 ms) (разрешение системного таймера увеличено с помощью timeBeginPeriod(1 ms)).
Получились очень точные 1500 ms.

Жаль, такой способ с timeBeginPeriod работает по-разному на разных версиях операционной системы windows, особенно на серверной.

ссылка на канал | ссылка на группу
Когда программа почему-то начинает вылетать каждый нечётный раз или после добавления всего одной кнопки, где-то есть ошибка или undefined behavior и приходится долго сидеть-искать в отладчике источник проблем.

Где-то вылез за границы массива, где-то увеличил размер динамической памяти вместо (size * sizeof(Block)) на просто (size)...

Количество локальных переменных в окне отладчика просто пугает.
Хорошо, что есть контрольные значения, куда можно добавить только нужные переменные.

ссылка на канал | ссылка на группу
Реверс-инженерим полосу прокрутки в windows).

Слишком часто получаются удобные или кратные числа, поэтому я быстро пойму, как работает слайдер, какие величины от чего зависят, какие используются коэффициенты.

ссылка на канал | ссылка на группу
Мало ли кому понадобятся названия частей, формула, размеры и расчёты полосы прокрутки для графического интерфейса).

ссылка на канал | ссылка на группу
А это способ определить, используя события winAPI, какой последовательный COM порт был подключён или отключен.

WM_DEVICECHANGE
DBT_DEVICEARRIVAL
DBT_DEVICEREMOVECOMPLETE
DEV_BROADCAST_PORT_A

ссылка на канал | ссылка на группу
Устаревшая реализация (deprecated implementation).
Новая реализация с исправлением ошибок
...

Функция intMap нужна, чтобы сдвинуть, сжать или расширить числовой диапазон.

Например, когда число приходит в диапазоне от -128 до 127 (int8_t) и его нужно преобразовать в диапазон от 0 до 599 (высота окна в пикселях).

Нужно просто написать:
int64_t value { 0 };
intMap(&value, -128, 127, 0, 599);

ссылка на канал | ссылка на группу
Media is too big
VIEW IN TELEGRAM
Проверка работы моей реализации слайдера.

Можно двигать список как ползунком, так и колёсиком мыши.
В зависимости от количества кнопок в списке меняется размер ползунка.
Если кнопки полностью помещаются в высоту списка, слайдер пропадает.
Панель чёрного цвета это область, где будет рисоваться график.

ссылка на канал | ссылка на группу
This media is not supported in your browser
VIEW IN TELEGRAM
Не знаю, что там лежит за левой границей массива, но это очень похоже на двоичную арифметику).

ссылка на канал | ссылка на группу
Когда нет никаких средств профилирования, на помощь приходит таймер высокого разрешения.
На моей системе у него точность 100 наносекунд.

ссылка на канал | ссылка на группу
Этот код составляет строку для отладочного экрана.
Выглядит массивно и страшно).

Будет интересно узнать, сколько времени, тактов процессора или ассемблерных инструкций нужно, чтобы выполнить этот код.

А потом переписать, используя свои строковые функции и замерить снова.
Благодаря проекту, я запросто сделаю динамические строки.

ссылка на канал | ссылка на группу
Решил попробовать компилятор cl (msvc).

Постепенно узнаю, какие есть ключи у компилятора и у линкера.
Нашёл способ, как сделать для оконного приложения точку входа main, а не winmain.

ссылка на канал | ссылка на группу
Этот код и ключи компилятора позволяют использовать 1 GB стека).

ссылка на канал | ссылка на группу
Вчера я решил в программе вместо GetTickCount использовать таймер высокого разрешения, но почему-то всё перестало работать.

В отладчике оказалось, что таймер возвращает текущее время в виде отрицательного количества наносекунд, что не нормально.

Оказалось, всё дело в переполнении.
И я нашёл способ, как решить эту проблему и получить правильное значение.

ссылка на канал | ссылка на группу
Блин, это так классно!
Не знал, что в наше время можно не только онлайн компилировать программу на C++, но и даже отлаживать её, видеть call stack.

ссылка на канал | ссылка на группу
Это реализация библиотеки chrono в msvc, а именно std::chrono::high_resolution_clock::now().

Я недавно сделал обёртку над QPC/QPF и столкнулся с ошибкой переполнения типа int64_t, спустя вечер реализовал алгоритм, который практически никогда не столкнётся с переполнением.

Что я недавно сделал, разработчики microsoft уже давно придумали и реализовали даже с комментариями в коде).

ссылка на канал | ссылка на группу
Если кому-то действительно понадобится моя реализация функции timeNow, таймера высокого разрешения (получение времени с точностью до 100 наносекунд), я выложу код на github, а пока и картинки хватит).

frequency и tick хотелось бы сделать const, но я не знаю, как инициализировать const переменную non-const значением из функции без лямбды или создания дополнительных функций.

ссылка на канал | ссылка на группу