Задать вопрос
  • Как реализовать "бегающие" точки?

    Nipheris
    @Nipheris Куратор тега C#
    Вопрос действительно академический: вам нужно основательно разобраться с событийно-управляемой (event-driven) архитектурой приложений. Пожалуй, все современные графические подсистемы так или иначе построены на ней (а вообще - не только графические). И в первую очередь нужно понять, что выполнение действий в своем цикле без передачи управления обработчикам сообщений - неверный подход. Дело в том, что GUI-приложение, в отличие от консольного, для того чтобы "не зависать", должно постоянно выполнять некоторые действия помимо нужных для вашей задачи, а именно - перерисовываться, обрабатывать события клавиатуры и мыши и т.д. Изза того что ваша программа "крутится" в цикле, то все те стандартные обработчики событий, которые должны получать управление, не получают его. Поэтому, если нужно выполнять интенсивные вычисления в графическом приложении, нужно либо:
    а) выполнять их в другом потоке - тогда получится сохранить структуру приложения и циклы, но встанет задача межпоточной передачи данных;
    б) выполнять работу порционно, время от времени передавая управления обработчикам системных событий. Это т.н. вызов DoEvents, в разных API он разный, но суть одна и та же.

    Конкретно для вашей задачи цикл на самом деле совершенно не нужен - вся анимация, какой бы они ни была, в современных приложениях (старые DOSовские игры не в счет) строится на таймерах и событиях их срабатывания. Поэтому вам нужно разобраться, как пользоваться в вашей среде таймерами и генерировать периодические события, и уже в обработчике события таймера делать label1.Text = "." , ".." , "..." в зависимости от того, какой "кадр" был предыдущий.
    Ответ написан
    Комментировать
  • Как запустить проект С# на другом пк?

    Nipheris
    @Nipheris Куратор тега C#
    Во-первых, как уже отметил GavriKos, соберите проект в Release-конфигурации - exe-шник, собранный в релизе, будет оптимизирован не для отладки, а для использования в продакшене. Во-вторых, определитесь с версиями Винды, на которых будете запускать проект - с 7-кой идет .net 3.5 (включающий в себя 3.0 и 2.0), c 8-кой - 4.5 (который включает в себя 4.0). Если попали в эти пары версия ОС/версия .net - то отдельно фреймворк ставить не надо, если не попали (например, ваше приложение под .net 4.5 нужно запустить на семерке), то тогда нужно получить инсталлятор с microsoft.com и установить на целевую машину. В-третьих, не забудьте с экзешником приложить все зависимости - если вы использовали какие-то библиотеки, то их сборки должны лежать вместе с exe. В общем все, остальное уже специфично для конкретного приложения. Для целей тестирования, если нужно свести риски незапуска к минимуму, могу посоветовать поднять чистую виртуалку с соотв. версией винды, и попытаться запустить там приложение в том виде, в котором вы его подготовили. Тогда станет понятно, что не учли и что нужно еще поставить.
    Ответ написан
    Комментировать
  • C#. DataAdapter нужно ли вызывать Dispose?

    Nipheris
    @Nipheris Куратор тега C#
    Толк от вызова метода Dispose есть всегда, когда есть сам метод Dispose (а если быть точным - если реализован интерфейс System.IDisposable). Тут просто не ваша ответственность разбираться - нужно ли вызывать Dispose или нет. Если автор класса реализовал этот интерфейс, значит для чего-то это ему нужно. Как правило это нужно, если используются управляемые вручную ресурсы (например, открытые файлы), либо в объекте создаются другие объекты, которые также IDisposable, и они должны подчищаться при disposing-е основного объекта, их создавшего.
    Если вы сталкивались с С++, то на мой взгляд Dispose - это и есть настоящий "деструктор" для объекта, который нужно вызывать самому (прямо или косвенно, с помощью using), чтобы корректно завершить жизненный цикл объекта. Так или иначе, вызывайте Dispose всегда, когда завершаете взаимодействие с объектом. Важно, что даже если СЕЙЧАС в реализации этого метода особо ничего не происходит, функционал может быть добавлен ПОЗДНЕЕ, в новой версии библиотеки которую вы используете. И тогда вам придется исправлять ваш код, чтобы избежать утечки ресурсов (незакрытые файлы или коннекции к БД часто гораздо бОльшая проблема, чем подтекающая память).
    Ответ написан
  • Как просто разбить грань фигуры на полигоны (триангуляция)?

    Nipheris
    @Nipheris Куратор тега C#
    Если используете OpenGL, рассмотрите алгоритмы, имеющиеся в библиотеке GLU - там есть достаточно качественный алгоритм тесселяции, поддерживающий сложные поверхности, в том числе с отверстиями. Т.е. вы передаете контуры поверхности: внешний и контуры дырок, алгоритм вам возвращает полигоны для отрисовки. Когда-то мне удалось применить его даже в паре с DirectX, т.к. времени на свою реализацию не было.
    Один из многих туториалов: www.glprogramming.com/red/chapter11.html
    Ответ написан
  • Какой фреймворк на c/c++ выбрать для реализации REST API?

    Nipheris
    @Nipheris Куратор тега C++
    EDIT: на сегодняшний день рекомендую Boost.Beast - одно из наиболее зрелых решений в плюсах.

    Старый ответ:
    Попробуйте C++ Network Library (на гитхабе) - проект достаточно молодой, но имеет очень интересный функционал и массу удобных абстракций, есть реализации URI, HTTP-клиента и сервера. Фактически это обертка над boost.asio, позволяющая не писать веб-сервер и клиент с нуля. Требует С++11.

    Кроме того, если есть требования по надежности/нагрузке, то лучше иметь дело с проверенным веб-сервером, и тогда стоит посмотреть в сторону FastCGI - тогда в инет будет смотреть какой-нибудь nginx или апач, а ваше приложение будет получать по FastCGI запросы от веб-сервера. Библиотеки для С++ имеются.
    Ответ написан
    Комментировать