• Почему происходит зависание формы и таймеров windwos forms?

    Nipheris
    @Nipheris Куратор тега C#
    Работать с UI, то есть с формами и контролами, из потока, НЕ породившего эту форму/контрол - очень плохая практика, которая рано или поздно приводит к таким проблемам, как ваша. Кроме того, она еще и усложняет отладку.

    Вне зависимости от того, какие у вас там вычисления, выполняйте их отдельно, складывайте результат в массив/Bitmap, а уже в UI-потоке по таймеру регулярно считывайте рассчитанные данные и отображайте в PictureBox.

    Даже если проблема не исчезнет, вам будет проще определить, где происходит зависание. Сейчас это может быть по куче различных причин. Повторюсь: то, что вы лочите pictureBox это не решение проблемы - в WinAPI НЕЛЬЗЯ работать с UI напрямую из другого потока, а WinForms это не более чем обертка над стандартными контролами.
    Ответ написан
    Комментировать
  • Какие качественные open source проекты есть на github (или где еще), для изучения?

    Nipheris
    @Nipheris Куратор тега C++
    Пара больших проектов:
    https://github.com/mapnik/mapnik
    https://github.com/mapbox/mapbox-gl-native

    Большая база кода, написано аккуратно, на современных плюсах, хорошая структура проекта, есть тесты.
    Ответ написан
    1 комментарий
  • Где можно посмотреть зарезервированные имена переменных?

    Nipheris
    @Nipheris Куратор тега C++
    Ошибку выдает компилятор или линковщик?

    Если компилятор, то это довольно странно, попробуйте вывести не y1, а строку, чтобы убедиться что проблема в y1.
    Если линковщик, то вероятно у вас y1 попадает external-линковкой из другого файла. Все правильно, из безымянного неймспейса ничего экспортироваться не будет, но это не значит, что имя из этого пространства "перекроет" собой остальные. Вот если вы найдете ДРУГОЙ y1 в другой единице компиляции, и его ТОЖЕ поместите в безымянный namespace, тогда все скомпилится без проблем.
    Ответ написан
    5 комментариев
  • Как захостить WCF на консоль так, чтоб служба была доступна в локальной сети?

    Nipheris
    @Nipheris Куратор тега C#
    консольное (WinForms)

    Это должно быть через слеш.

    99% что проблема в том, что ваша служба слушает на локалхосте, а не на реальном интерфейсе или на 0.0.0.0. В зависимости от того, как вы ее хостите, где-то (в коде или конфиге) у вас должен быть указан адрес для прослушивания. Если он 127.0.0.1 или localhost - вам нужно заменить его на адрес сетевого интерфейса, где запущена служба. Или слушать на всех интерфейсах сразу, тогда урл будет вида http://+:порт/ - причем если у вас http, то для запуска вам понадобятся права администратора (т.к. сервис будет регаться в системном обработчике http.sys).

    По большому счету вопрос не про WCF, а про запуск сетевой службы в принципе. Апач или IIS вам тоже ничего не будут отвечать по сети, если попросить их слушать на localhost.
    Ответ написан
    6 комментариев
  • Как создать файл с расширением .db из файла с расширением .sql?

    Давайте условимся говорить о формате sqlite, раз уже выяснили в комментариях.
    Итак, качайте command-line shell отсюда: sqlite.org/download.html
    Запускаете его, указав в качестве параметра имя нового файла БД, например sqlite3 demo.db (пример тут).
    Дальше все инструкции на SQL поочередно вставляете и выполняете. Все будет писаться в указанный вами файл.

    Если очень хочется GUI, то SQLiteStudio - то, что я обычно рекомендую. Там также нужно будет подключить новую БД, и выполнить в ней все ваши SQL конструкции.

    Впрочем, Руслан Федосеев привел куда более удобный вариант, чем по одному запросу кидать))
    Ответ написан
    Комментировать
  • Какая разница в асинхронных методах?

    Nipheris
    @Nipheris Куратор тега C#
    Разница в том, что await можно использовать только в async-методе, и его использование подразумевает, что компилятор превратит метод в сопрограмму, и в том месте, где стоит await, его выполнение можно будет приостановить и переключиться на что-то еще.

    Использование Result остановит ваш поток до тех пор, пока таск не завершится и не вернет результат. Но Result можно использовать и в обыкновенном методе, не только async (в async методе его использовать абсолютно бессмысленно).

    Кроме того, использование Result влечет за собой неочевидные эффекты в виде возможности дедлоков и усложняет обработку исключений (т.к. Result всегда кидает AggreagteException, в который оборачивается исключение, брошенное внутри таска), подробнее смотрите тут stackoverflow.com/questions/24623120/await-on-a-co...

    Как первый ответ отвечает на ваш вопрос я не понимаю)
    Ответ написан
    6 комментариев
  • Как конвертировать точечный массив в числовой в c#?

    Nipheris
    @Nipheris Куратор тега C#
    System.Drawing.Point[] points = ...
    float[,] data = new float[points.Length, 3];
    for (int i = 0; i < points.Length; i++)
    {
    	data[i, 0] = points[i].X;
    	data[i, 1] = points[i].Y;
    	data[i, 2] = 0.0f;
    }
    Ответ написан
    7 комментариев
  • Уничтожить объект в foreach?

    Nipheris
    @Nipheris Куратор тега C#
    Если я прохожусь циклом foreach

    Не стОит удалять что-либо из коллекции, по который вы В ДАННЫЙ МОМЕНТ проходитесь foreach. Чревато исключениями по причине умерших енумераторов.

    как уничтожить объект из массива, если имеется только его копия

    Взять обычный for, определить критерии сравнения двух объектов (чтобы собственно выяснить, какой объект является "копией" - по ссылке не сравнишь, т.к. это уже другой самостоятельный объект) - по каким-либо свойствам или еще как-то, найти этот объект и удалить его смещением остальных элементов массива на его место. Если бы у вас был список, достаточно было бы RemoveAt.
    Ответ написан
    Комментировать
  • Как увеличить скорость вставки в InnoDB таблицу?

    BEGIN TRANSACTION
    -- Вставляете строки порциями по 10-100К штук
    COMMIT
    Ответ написан
    8 комментариев
  • Оптимизация графики?

    Nipheris
    @Nipheris Куратор тега C#
    А не будет ли GDI быстрее GDI+?

    GDI+ будет медленнее только при включенном сглаживании. В остальном их отличия не принципиальны.

    что без directx и opengl не добиться нормальной прорисовки на форме

    Смотря что вы понимаете под нормальной прорисовкой, и сколько у вас на форме контролов. Конечно, сегодня графику стараются рисовить на железе, собственно отсюда и новые стандарты качества. А вообще, Артём прав - что вы хотите от managed-обертки над GDI/GDI+ и стандартными виндовыми контролами, коей и является WinForms.
    Ответ написан
    Комментировать
  • Является ли статическая функция С++ потокобезопасной?

    Nipheris
    @Nipheris Куратор тега C++
    С чего бы этому вызову быть потокобезопасным, если у вас в функции статические переменные?
    Выполняется ли проверка File()::exists(settingsFilePath) при каждом обращении к функции

    А почему она не должна выполняться?

    Кстати, а зачем вам две разные статические переменные set?
    Ответ написан
    Комментировать
  • Как правильно передавать объекты в N-layer архитектуре?

    Nipheris
    @Nipheris Куратор тега C#
    GenericRepository и его метод GetAll - это ни о чем. В том смысле, что вам такой репозиторий не нужен - он ничего не делает и ничего не абстрагирует. Вы выставляете IQueryable - и получаете проблемы на свою голову. Да, это очень соблазнительная штука, но таки репозиторий для того, чтобы все возможные запросы оставлять там, иначе они уходят далеко в логику приложения. Вам нужен конкретный репозиторий (интерфейс GenericRepository может и пригодится) с конкретными запросами, возвращающими IEnumerable. В этом и его суть - на уровне репозитория делается ПЕРВИЧНАЯ выборка (с помощью IQueryable), которая по сути есть запрос к БД и материализация всех НУЖНЫХ объектов, а потом уже мелкую фильтрацию можно делать с объектами в IEnumerable коллекции.

    Как организовать передачу сложных объектов (НЕ СУЩНОСТЕЙ) с уровня DAL на уровень BLL?

    Я бы сделал свой репозиторий для каждой такой вещи. Он будет ОТЛИЧАТЬСЯ от репозитория для сущностей, т.к. там не будет, например, Update. Это будет репозиторий ЗАПИСЕЙ, не объектов. В остальном все также - все возможные запросы нужно постараться собрать там. И класс тоже можно и нужно завести вроде BookReport, только он будет immutable, т.е. будет вести себя как запись. А дальше уже делайте с ним что пожелаете.

    Но если такая выборка находится в репозитории, получается метод репозитория должен возвращать List и уровень DAL будет связан с уровнем BLL.

    Вот тут не понял. Ну пусть возвращает List или IEnumerable, в чем тут вы связь видите?

    Вообще, возможно вам нужно поменьше париться о разделении DAL и BLL. Как правило это приводит к anemic data model, и ничего кроме вреда это вам не принисет. Вообще не знаю откуда эта мода пошла, у меня всегда получалось 80% логики оставлять в самих классах сущностей, и все было ок.
    Ответ написан
    1 комментарий
  • Как отобразить QWidget в QML приложении?

    Nipheris
    @Nipheris Куратор тега C++
    Сам не пробовал и не проверял, но есть отличный ответ на SO.

    Пишут, что можно в Qt Quick 1, но нельзя в 2+ по причине введения графа сцены.
    Ответ написан
    Комментировать
  • Какой существует инструмент прототипирования базы данных?

    Работал и советую:
    • ERWin Data Modeler - классика жанра. Штука платная (есть Community редакция с ограничением до 25 таблиц на схему) - хороший инструмент, не замороченный, минимум неожиданностей. Минус - только под Винду (возможно ошибаюсь, но линукс-версии не видел).
    • SQL Developer Data Modeler от Оракла - более навороченная штука, есть некоторые странности и переусложнения, написана на Java. Но зато бесплатная, пользоваться вполне можно. Плюс - сохраняет схему в достаточно короткие xml-файлы, организованные по папкам. Специальным суффиксом .local помечаются файлы, которые локальны для текущей машины. Вывод - очень удобно использовать с системой контроля версий.

    А вообще инструментов действительно миллион, некоторым из них уже за десяток лет. Есть и много новых, онлайновых. Вообщем, гуглите еще. На википедии вообще завались.
    Ответ написан
    Комментировать
  • Как правильно написать авторизацию/аутентификацию?

    С полного нуля. Пользователь вводит логин + пароль:
    Пользователь входит через ВК


    Не имеет особого значения, ваша задача полученную информацию замапать на ID пользователя в ВАШЕЙ базе, с учетом необходимых проверок. ВК будет считаться доверенной стороной, т.е. ему вы доверяете процедуру проверки аутентичности юзера. Если аутентификация на вашей стороне - то проверяете вы (проверяете пароль по соленому хешу в базе, ну или как-то еще). Если у вас "быстрый вход" по ВК (без регистрации), то нужно сделать еще авторегистрацию, если userid не найден по данным от ВК. Правда, тут нужно быть готовым, что юзер захочет слинковать свои аккаунты, если он уже зарегался по логину/паролю. Ну или хотя бы предупредить при входе по ВК, что он в базе не найден и будет создан новый акк, чтобы он не удивлялся потом.

    Что писать в куки


    идентификатор сессии. Как уже сказали, должен быть сложным для копирования (скопированный идентификатор сессии - украденная сессия), уникальным. Погуглите алгоритмы или воспользуйтесь стандартыми. Сессии хранить или стандартными средствами, или попробовать редиску (там есть авто-expire, что приятно).

    Если нужно, чтобы у пользователя был только одновременный доступ с одного устройства - как быть?

    проверять наличие сессии для данного пользователя (по ID пользователя с этапа аутентификации). Если сессия уже есть - убивать ее, создавать новую (новое устройство успешно зайдет, старое - "разлогинится"). Юзеру правда ничего не помешает скопировать идентификатор сессии из кукисов на другой девайс, так что можете еще в сессию IP писать, или user-агента (поменялся - пересоздаем сессию).

    А если с нескольких?

    ничего дополнительно не проверять, допусть создание любого количества сессий.

    Как на каждой странице организовать проверку авторизован пользователь или нет?

    идем в хранилище сессий (стандартные механизмы PHP/Redis), запрашиваем/стартуем сессию по идентификатору, пришедшему в куках. Если такой сессии нет (устарела, либо никогда и не было, идентификатор юзер сам придумал) - авторизацию не выполняем. Если сессия есть - то в зависимости от того, что мы там храним, либо достаем USERID, и пробиваем по основной БД его права, либо достаем права из самой сессии, если мы их там закешировали. "Выдача" прав - есть процедура авторизации. Теперь в зависимости от набора прав - меняем логику внутри скрипта. В больших системах применяют понятия ролей и групп - это все можно погуглить. Вкратце - при авторизации определяется, в каких группах состоит пользователь. Затем, по множеству групп сопоставляются роли, которые "играет" пользователь в системе (администратор данных/пользователей, администратор бэкапа, главбух, менеджер и т.д. и т.п.). Роли фиксированы, и зависят от логики приложения - в зависимости от имеющихся у пользователя ролей меняется и поведение приложения.
    Также сейчас можно встретить claim-based подход, особенно в asp.net - тоже погуглите.

    Что хранить в сессии?

    Как минимум - USERID, но можно еще и закэшировать информацию о его правах, чтобы не читать постоянно ее из основной базы. Плюс, тут же хранить данные, относящиеся к САМОЙ сессии, например тот же IP входа, время входа и т.д. Тут зависит от задачи.
    Ответ написан
    Комментировать
  • Актуален ли сейчас WPF?

    Nipheris
    @Nipheris Куратор тега C#
    разработка остановилась 5 лет назад и тому подобное

    Да, есть некоторый застой, основные силы переброшены на .net core и asp.net

    Правда ли, что WPF ждет судьба WinForms?

    Что конкретно вы имеете в виду под "судьбой WinForms"?

    Есть ли альтернатива WPF?

    Под .Net нету, под WinRT есть аналогичная подсистема, во многом скопированная с WPF, вообще под десктоп есть еще Qt, но это C++ (если не считать биндингов на другие языки)

    Что сейчас Microsoft предлагает для разработки GUI?

    Universal Windows Platform для Windows 10 - их основное направление, для классического десктопа - ничего нового.

    что WPF уходит в прошлое

    Альтернативы под .net нету, никуда он уходить не может (не все пока хотят связываться с Metro и UWP приложениями).
    Ответ написан
    Комментировать
  • QTreeView и QSqlRelationTableModel/QTableModel?

    Nipheris
    @Nipheris Куратор тега C++
    Наиболее гибким вариантом в вашем случае я считаю наследника от QAbstractItemModel. Отображать его вполне можно с помощью QTreeView.
    Ответ написан
  • Что использовать для написания приложения без многожества форм?

    Nipheris
    @Nipheris Куратор тега C#
    1) определитесь, что у вас будет базовым документом. Т.е., чего у вас будет много. Сейчас, я так понимаю, это заказ. Итак, это документ и он будет множиться. Советую его сделать табами.
    2) информационная панель и список пользователей вполне могут быть сделаны док-панелями справа и слева. Причина проста - на них придется часто смотреть, следить за ними. Постоянно переключаться не вариант. Правда, тогда они должны быть не так обильно наполнены элементами, как панель заказа, но мне кажется у вас как раз так и будет. Если у вас на инф. панели в основном сообщения, а на вкладке "список пользователей" - только этот список, ты выделять под такое весь экран нет смысла.

    Итого: слева инф. панель (15-20%), справа список пользователей (15%), оставшееся по центру - таб-контрол для заказов, по принципу табов в браузере (можно даже плюсик сделать для создания нового заказа). Альтернативный варинт - инф. панель снизу, под таб-контролом для заказов
    Ответ написан
    Комментировать