Делаю всякое :)
Контакты

Достижения

Все достижения (2)

Наибольший вклад в теги

Все теги (15)

Лучшие ответы пользователя

Все ответы (34)
  • Почему при сложении 0.001 типа float или doable 1000 раз через несколько нулей после запятой появляются ещё числа из ниоткуда и как это решить?

    gdt
    @gdt
    Программист
    И ни одного пояснения :)
    Если вам нужно, чтобы работало так, как вы ожидаете - воспользуйтесь замечательным советом Бобби Шифер .
    Если объяснить на пальцах - есть два способа хранить числа с точкой - fixed point (фиксированная точка) и floating point (плавающая точка). У себя в примере вы используете тип данных с плавающей точкой (неспроста он называется float, а double - это float с двойной точностью, только и всего). Грубо говоря, числа с плавающей точкой представляются так: M*10^E, т. е. в памяти два значения M и E просто следуют друг за другом. К сожалению, компьютеры используют двоичную систему счисления, и далеко не всегда то, что можно просто записать в десятичной системе счисления - настолько же просто записать в двоичной, и наоборот. С учётом того, что объём памяти, выделяемый под хранение мантиссы, ограничен - она округляется до ближайшего двоичного представления, что после перевода назад, в десятичную систему счисления, и даёт такой, на первый взгляд, контринтуитивный результат.
    Для разнообразия можете попробовать сложить очень маленькое и очень большое число.
    Ответ написан
  • Как менять цвет при наведении на контрол?

    gdt
    @gdt
    Программист
    Вот так работает:
    <ControlTemplate x:Key="TestButtonTemplate" TargetType="Button">
        <Border Background="{TemplateBinding Background}"
                BorderThickness="0"
                CornerRadius="5"
                Height="{TemplateBinding Height}"
                Width="{TemplateBinding Width}">
            <ContentControl Foreground="{TemplateBinding Foreground}"
                            Content="{TemplateBinding Content}"
                            VerticalAlignment="Center"
                            HorizontalAlignment="Center"
                            FontSize="{TemplateBinding FontSize}"
                            FontFamily="{TemplateBinding FontFamily}"/>
        </Border>
    
        <ControlTemplate.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="Background" Value="Red" />
            </Trigger>
        </ControlTemplate.Triggers>
    </ControlTemplate>


    Лениво разбираться в причинах, но наверное вам нужно менять свойства самого контрола, раз вы на них биндитесь в Border
    Ответ написан
  • Как исправить ошибку - длинный путь к файлу?

    gdt
    @gdt
    Программист
    Длина того фрагмента пути из сообщения 193 символа, а в Windows существует ограничение длины пути в 260 сиволов, так что если длина пути до папки "Тест сцен" превышает 66-67 символов (в зависимости оттого, учитывается ли null в конце) - вам придётся переместить репозиторий на уровень выше.
    Вот похожие проблемы:
    * https://github.com/microsoft/MixedReality-WorldLoc... - решилось перемещением проекта в корень диска
    * https://github.com/microsoft/MapsSDK-Unity/issues/51 - тут рекомендуют включить поддержку длинных путей в git командой git config --system core.longpaths true

    Вот тут на Хабре есть один из вариантов решения.
    Ответ написан
  • Как убрать async, если не нужон, но требует?

    gdt
    @gdt
    Программист
    Во-первых, используйте .GetAwaiter().GetResult() если вам нужно получить результат синхронно.
    Во-вторых, ваш дедлок это хрестоматийный пример, примерно как детский мат. Дело в том, что вы не указали .ConfigureAwait(false) в своём асинхронном вызове, это значит, что CLR будет ждать освобождения вызывающего потока, чтобы продолжить выполнять код после await. Однако вызывающий поток уже бесконечно занят ожиданием завершения вашего асинхронного метода там, где вы получаете Result - вот вам и типичный deadlock.
    Таким образом, вам нужно либо добавить .ConfigureAwait(false) к вашему асинхронному вызову (это приведет к необходимости выполнять дальнейшие изменения в UI через диспетчер, Dispatcher.Invoke в WPF), либо запустить свой код в контексте синхронизации, отличном от того, который используется в UI - самый простой способ это вообще не использовать контекст - выполнить свой код внутри Task.Run:
    Task.Run(async() => html = await browser.GetSourceAsync());

    Или
    private async Task<string> GetHTMLFromWebBrowser()
    {
        return await browser.GetSourceAsync();
    }
    
    ....
    
    Task.Run(async() => html = await GetHTMLFromWebBrowser());

    .ConfigureAwait() в таком случае не нужен, т. к. без контекста синхронизации он ничего не делает.
    Ответ написан
  • C++ Как сделать постоянный вывод, и только тогда, пользователь что-то выполнить ввод в цикле?

    gdt
    @gdt
    Программист
    Вы не указали операционную систему. Если у вас linux (или что-то подобное) - вот тут есть решение при помощи select.

    В общем случае вы можете запустить отдельный поток, который в цикле выводит то, что вам нужно, и проверяет был ли установлен ивент (WaitForSingleObject, с таймаутом 0). В главном потоке создаёте ивент (CreateEvent), ждёте как обычно _getch, когда символ введён - используете SetEvent чтобы сигнализировать об этом второму потоку, также есть функция ResetEvent - чтобы сбросить ивент после обработки (чтобы можно было в цикле после следующего введённого символа его ещё раз установить). Это уже для windows.

    Ну и да, _getch это ни разу не C++, а голый C.
    Ответ написан