Задать вопрос
Ответы пользователя по тегу C#
  • Почему некорректно получаются данные по сокету?

    @rPman
    кто тебе надоумил отсылать в сокет СТРОЧНОЕ представление размера?
    Encoding.ASCII.GetBytes(buffer.Length.ToString())
    ulong.Parse(Encoding.UTF8.GetString(size))а потом пытаться его отпарсить из UTF8! строки длиной 1024 байта, что там у тебя после твоих циферок будет лежать, одному богу известно, будет похоже на число - приплюсуется к размеру

    отправлять надо фиксированное колчичество байт (даже считать не надо, отправляешь int размером sizeof(int) и столько же читаешь прямо в int
    Ответ написан
  • Как сделать трансляцию экрана через сокеты в C#?

    @rPman
    ты хандлер сокета клиента закрыл сразу после отправки
    убери handler.Close();

    upd. еще подумай, что будет если к твоему сервису подключится второй клиент, т.е. listener.accept должен создавать новый хандлер который как то нужно обрабатывать либо вообще выноси из цикла accept (второй сделай вложенный) и пока клиент хандлер не закроет, тупо шли в него картинки.

    Еще момент, ты должен как то сообщить клиенту, сколько данных будешь передавать, например сначала шлешь размер буфера с изображением, а затем сам буфер. Само собой клиент точно так же должен это ожидать
    Ответ написан
    Комментировать
  • Почему при чтении из потока read блокируется, даже если данные есть?

    @rPman
    Тебе нужно асинхронное чтение потоков процесса, это можно сделать, добавив на колбек свой метод process.OutputDataReceived и ErrorDataReceived соответственно, а после process.Start() сразу запускаешь чтение потоков process.BeginOutputReadLine и BeginErrorReadLine

    Вот дока с примером
    --------------upd---------------

    Для чтения не по строкам, пользуйся асинхронным методом у StreamReader - ReadBlockAsync

    Чтобы можно было брать потоки process.StandardOutput и process.StandardError, у process.SystemInfo нужно установить RedirectStandardOutput = true и RedirectStandardError = true соответственно.

    Осторожно, ReadBlockAsync может вернуть блок меньшего размера

    Пример кода
    using System;
    using System.Threading.Tasks;
    using System.IO;
    using System.Diagnostics;
    
    namespace ProcessStdoutTaskTest
    {
        class MainClass
        {
            static char[] bufOut = new char[5];
            static char[] bufErr = new char[5];
            async static void ReadAsyncStream(StreamReader sr, char[] buf)
            {
                int size;
                while ((size = await sr.ReadBlockAsync(buf, 0, buf.Length)) != 0)
                {
                    Console.WriteLine((buf==bufOut?"out":"err")+" '" + new string(buf, 0, size) + "'") ;
                }
            }
            public static void Main(string[] args)
            {
                using (Process process = new Process())
                {
                    process.StartInfo.FileName = "/bin/bash";
                    process.StartInfo.Arguments = "-c \"printf 'abc';printf 'def' 1>&2;printf 'ghi';printf 'j' 1>&2;\"";
                    process.StartInfo.UseShellExecute = false;
                    process.StartInfo.RedirectStandardOutput = true;
                    process.StartInfo.RedirectStandardError = true;
                    process.Start();
    
                    ReadAsyncStream(process.StandardOutput, bufOut);
                    ReadAsyncStream(process.StandardError, bufErr);
    
                    Console.Write("Wait to process exit ");
                    process.WaitForExit();
                    Console.WriteLine("ok");
                }
    
                Console.WriteLine("Press enter to exit.");
                Console.ReadLine();
            }
        }
    }

    Будет вывод:
    Wait to process exit ok
    Press enter to exit.
    out 'abcgh'
    out 'i'
    err 'defj'

    Кстати поведение объединения отдельных строк в потоках из разных кусочков не гарантируется, как я понимаю это зависит от того как использует flush на stdout запускаемый процесс, в моем примере это bash и он явно буферизирует вывод
    Ответ написан
  • Как проверить файлы и найти в них 3 наибольших числа c#?

    @rPman
    2 подхода

    простой но не эффективный (для 15 файлов тебе пофиг) - это открыть по очереди файлы, добавить в массив из каждого число, затем отсортировать массив и взять последние 3 числа (или первые 3, если сортировать в обратном порядке)

    по сложнее - подходит, когда количество максимальных чисел заметно большое или переменное, в этом случае заводишь массив искомых чисел длиной +1 (длинной 4 в твоем случае), заполнив любым гарантированно минимальным значением (отдельный разговор каким, например -2147483647 для 32-битных целых) и затем открываешь по очереди файлы, читаешь из них числа, по одному, и добавляешь число в конец массива (заменяя лежащее там число, оно не нужно так как 4-ое), затем для каждого числа начиная с предпоследнего к первому делаешь операцию замены их местами, если текущее число меньше стоящего справа. По окончанию первые 3 числа и будут искомыми.
    Заполнение массива гарантированно минимальным числом иногда не подходит, тогда необходимо первичное заполнение массива делать числами из файлов, заведя переменную - текущий размер искомого массива, начиная с 1 и увеличивать до требуемых (в твоем случае 4)
    Ответ написан
    Комментировать
  • Какой есть аналог Microsoft.Office.Interop.Word для .Net Core?

    @rPman
    Когда то с меньшими версиями студии и офиса) я просто добавлял dll файлы к проекту, в виде компонент, они так и назывались, необходимые зависимости студия пишет в ошибке при запуске или компиляции, уже не помню точно

    nuget пакет тут явно не поможет

    еще в интернетах пишут что нужно выбирать правильный тип проекта
    Ответ написан
  • Как записать образ операционой системы созданой через дополнение к visual studio Cosmos (язык C#)?

    @rPman
    У них свое ядро (не linux) и свой загрузчик!

    У тебя похоже только один вариант, побайтовая копия iso образа на флешку (и это может не сработать, ведь их загрузчик должен уметь это обрабатывать а uefi они не умеют, только на обсуждении), так же в Roadmap - Future у них записан USB

    В rufus есть "Запись образа в режиме DD" выбирай его, либо ищи альтернативы linux dd, какой-нибудь windd или Win32DiskImager и пиши прямо на диск (не раздел!) само собой все данные будут уничтожены

    p.s. qemu у них заявлен в поддержке, значит как вариант, ставишь минимальный linux, прямо в initramfs.img интегрируешь kvm/qemu и прописываешь в скрипт запуска запуск виртуальной машины на полный экран
    Ответ написан
  • Есть ли в c# ограничение длины строки компилятором?

    @rPman
    2Gb
    The maximum size of a String object in memory is 2-GB, or about 1 billion characters.
    Ответ написан
    3 комментария
  • Как тестировать сервер на сокетах?

    @rPman
    Да клиент понадобится, только скорее всего пустой, только симулирующий настоящего.
    Так же тебе скорее всего захочется тестировать нескольких одновременных подключений, наверное самый сложный способ но его можно совместить с нагрузочным, где то что то вылетит
    Ответ написан
  • Какая нужна модель для описания каждой конкретной монеты на счету?

    @rPman
    У криптовалют типа bitcoin (не etherum) именно так и реализовано - баланс на аккаунте пользователя это сумма не потраченных выходов, т.е. буквально каждый входящий перевод (сдачи от исходящих)

    Для реализации у тебя должен быть лог всех переводов монет (от кого к кому), причем каждая транзакция это ссылка на предыдущие переводы и список адресов источников с указанием количества по каждому, а чтобы каждый раз не считать сумму - вычислять ее триггером на добавление новой транзакции. Само собой при каждой транзакции нужно проверять что сумма указанных входов равнялась (или была не меньше) суммы исходящих.

    Кстати, в этой модели способов сформировать один и тот же по сумме перевод может быть несколько (можно брать разные входящие переводы), и можно (судя по всему твоя задача именно такая?) можно формировать лишние выходы, например по каждому входу от разных пользователей создавать точно такое же количество (или объединять по пользователю) выходов.
    ------------------

    Формально, у тебя матрица, столбцы и колонки - это пользователи, а ячейки - текущий баланс, полученный от соответствующего пользователя. Можешь использовать эту модель, но историю придется так или иначе сохранять, причем в зависимости от целей, ее можно сохранять в каждой ячейке (например чтобы восстанавливать всю матрицу на момент времени в прошлом)
    Ответ написан
  • Как сделать плавное равномерное передвижение?

    @rPman
    Ты используешь Vector3.Lerp который считает расположение точки между двумя указанными позициями (у тебя это текущая позиция и та что пришла по сети), третий параметр должен быть при значении 0 и 1 соответственно первой позиции и второй, при значениях больше - позиция будет интерполирована дальше линейно, у тебя же там speed*Time.deltaTime что это значит я полагаю ты сам не понимаешь.

    Наверное ты хотел чтобы позиция на экране была между предыдущей и новой в зависимости от того на сколько время отличается? т.е. прилетел пакет быстро, интерполяция на короткое расстояние, если с задержкой - то на далекое?

    Ты пробовал просто позицию полученную по сети подставлять без интерполяции?

    p.s. без относительно фреймворка, передавай не позицию объекта, а его управление (команды на изменение поведения, повтороты, изменения скорости и т.п., и соответственно считай его новые координаты на удаленном клиенте точно так же как на сервере, но жестко привязывая к тикам времени, кодить такое сложнее но зато скроет лаги очень хорошо (пока взаимодействие не начнется само собой)
    Ответ написан
    1 комментарий
  • Как я могу изменить название .exe и название процесса моей программы?

    @rPman
    Закрой проект, открой в текстовом редакторе файл проекта *.csproj (формат xml) и замени название в теге <AssemblyName>....</AssemblyName>

    после открытия на всякий случая очисти и пересобери проект (build -> clean)
    Ответ написан
    Комментировать
  • Как правильно пропарсить лабиринт в граф?

    @rPman
    Лабиринт в форме - ячейка это либо стена либо проход (0/1)?

    Заводим класс - 'Вершина графа', ребра которого - его параметры ссылок на Смежные вершины, для каждой стороны вверх, вниз, налево и направо. Если нужно выявление замкнутых подмножеств, то добавляем параметр - номер подмножества (значение 0 - неизвестно)

    Создаем временную матрицу для хранения вершин (можно добавить параметр в объект ячейки матрицы, если такой есть) с пустыми/нулевыми значениями
    Пробегаем по матрице лабиринта, на каждую пустую ячейку (проход) создаем вершину графа, пусть перебираем матрицу сверху вниз и слева направо, то для каждой такой ячейки смотрим наличие прохода слева и сверху, если есть, добавляем соответственно ссылки на слева и сверху, а для их вершин ссылку на текущую созданную соответственно справа и снизу.

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

    В результате когда пройдем по всем ячейкам матрицы, у нас будет готовый список графов, ячейки которого пронумерованы (ну не по порядку, будут пропуски номеров), понадобится еще проход, чтобы записать в список эти группы, и можно удалять временную матрицу вершин
    Ответ написан
    Комментировать
  • Стоит ли делать кэширование результата запроса из бд?

    @rPman
    Подумай хорошенько, где ты собираешься кешировать и как инвалидировать кеш (проверять что данные в кеше устарели), получишь ответ на этот вопрос почти сразу

    Второй вопрос очень важный, как запускается код бота, в режиме получил запрос (реакция от пользователя) и завершил процесс либо процесс запускается как сервис и работает в единственном экземпляре (тоже важно, так как бывает что то типа кластера, но явно не твой случай)?

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

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

    Вот от сюда и думай, что хранить, где хранить надо ли делать запрос в базу или можно из памяти и т.п.
    Ответ написан
    2 комментария
  • Как реализовать парсер сайта скриптами JS из приложения c#?

    @rPman
    Как бы ты не изворачивался, либо у тебя получится поддержка только подмножества веб приложений (и очень не эффективное) либо очередной браузер, но зачем, когда есть готовые.

    Подключаешь к проекту какой-нибудь браузер, открываешь требуемую ссылку там, мониторишь итог на предмет окончания загрузки (отдельная проблема)...
    например штатный компонент .net WebBrowser это древний internetexplorer11 на windows, но при запуске проекта на mono - это будет что то основанное на firefox

    этот вариант будет иметь наивысшую производительность, наверное даже лучше selenium, так как это не отдельный браузер а только библиотека с кастрированным функционалом, но не на много (грубо говоря нет поддержки расширений, работы с камерами, уведомлениями и т.п.), так же такой способ проще детектировать со стороны веб приложения, которое борется с автоматизациями
    Ответ написан
    2 комментария
  • Как сменить источник данных dataGridView через код WinForms C#?

    @rPman
    visual studio генерирует весь код, который ты накликал в дизайнере форм, практически ничего за кадром не остается, смотри в файлах проекта они в инспекторе есть
    смотри как там прописывается источник данных, и делай так же

    p.s. вообще то вопрос что такое сменить источник данных
    Источник данных это DataSource, если все создается в дизайнере форм то данные туда заливаются из базы по запросу (а у тебя таблица эксель через adodb подключается как таблица), ну так меняй подключение или запрос, если тот же файл, на событие onchange комбобокса

    загрузив новые данные datagrid все подхватит сам
    Ответ написан
    Комментировать
  • Можно ли упростить данный код для подключения к базе данный MySQl на C#?

    @rPman
    если используется Visual Studio, то для работы с базой данных можно использовать его инструменты, практически весь код будет генерироваться средой, а ты мышкой щелкать по окнам интерфейса, настройка подключения базы данных, создание DataSource, в которое автоматически будут залиты выбранные таблицы (или прямо по запросам) со структурой из базы данных,... если продолжать дальше то с помощью DataBinding данные можно связать с элементами интерфейса так что выбирай к примеру записи в одном списке, связанные данные из другой таблицы будут отображаться в другом.

    Первое что нагуглил это для VB# но разницы нет никакой
    Ответ написан
  • Можно ли сделать чтение лога медленных запросов mysql в десктопном приложении?

    @rPman
    шлешь в бесконечном цикле паузу и запрос
    SHOW FULL PROCESSLIST;
    сохраняешь список идентификаторов для проверки а следующем шаге, проверка - если какой то id остался с прошлой проверки - считать этот запрос медленным, интервал (длина пауза) между запросами - пороговый интервал для определения что такое 'медленный'

    upd. можешь добавить к идентификатору содержимое info, как то поможет, чтобы хоть немного обойти замечание акина
    Ответ написан
    2 комментария
  • Мое приложение весит больше 150 мб, и я не могу выставить его на всеобщее обозрение в Play Market, что мне делать?

    @rPman
    еще есть AAB, не решает основную проблему но позволяет раскидать ресурсы, рассчитывающие на различные устройства (например разрешение экрана) по отдельным файлам а гугл сам будет решать какой грузить, это откладывает проблему немного на потом

    upd. попробуй APK Expansion Files, гугл хостит файлы до 2Гб, их можно прикладывать к приложению и они будут загружены сразу после установки
    Ответ написан
    1 комментарий
  • Зациклить код в сишарпе?

    @rPman
    'зациклить' - это способ решения задачи, а вопрос должен быть о самой задаче, иначе совершенно непонятно что тебе нужно.

    потелепатствую - у тебя на форме есть типа браузерные компоненты и для первого попавшегося, в котором адрес будет совпадать с указанным условием нужно вернуть html тело страницы?

    p.s. запускай указанный код без sleep в методе компоненты Timer, настроив его на интервал опроса
    Ответ написан
    2 комментария
  • Запуск своей программы вместо графической оболочки в Linux?

    @rPman
    Например
    1. отключаешь display manager - lightdm (или что у тебя там для меню авторизации и выбора DE)
    2. минимум что необходимо для работы графического режима - это xserver, для его запуска достаточно запустить утилиту X (кстати кажется до сих пор требует root), будет запущен графический сервер без Desktop Environment, но нужно понимать что DE отвечает за управление окнами, а точнее управление их размерами, положением на экране и вообще сокрытие/минимизация. Т.е. без этого, если твое приложение ожидает что пользователь будет перемещать его окна (а это к примеру диалоговое окно открытия/сохранения файлов) то он уже это сделать не сможет, все окна будут без заголовков и бордюра для изменения их размеров.
    И кстати, чтобы графическое приложение запустилось и отображалось на X нужно устанавливать переменную окружения DISPLAY, значение смотреть либо в конфиге X либо в логах (скорее всего будет что то типа :0, это имя сервера и номер xserver, запущенного на нем, напоминаю, что linux из коробки умеет multiseat)
    3. чтобы появился хоть какой то интерфейс взаимодействия, нужно установить DE, из минималистичных, идеальных для kiosk mode - я бы рекомендовал awesome, в нем к примеру можно настроить чтобы все открываемые окна сразу разворачивались на весь экран.

    Кстати со всеми xserver обычно идет древний дефолтный twm, настолько примитивный что даже смешно, но если бы при открытии любого окна он не требовал от пользователя указать расположение и размер, им можно было бы пользоваться (не удивлюсь если это настраивается но никогда этим вопросом не задавался).

    Из минималистичных и вполне функциональных DE можно предложить еще какой-нибудь openbox, его можно настроить так чтобы вообще никаких 'пуск' и списка задач не было, а только иконки и приложение на весь экран. Но пользователь сможет добраться до редактирования меню и запустить любое приложение, т.е. это не для kiosk mode

    Чтобы запустить xserver с DE автоматически можно либо настроить автозагрузку в lightdm (это правильно) либо просто запускать утилиту startx, которая смотрит в пользовательском каталоге .xinitrc и запускает DE от туда.

    На самом деле процесс запуска DE стал очень замудреный, его запутали несколько поколений разработчиков и выпутывать не желают, но обычно все это критично для тяжелых DE типа KDE, а что то простое и легкое с приложениями на gtk работает и так

    Собственно как запускать приложения автоматически при включении компьютера тоже вопрос очень интересный, способов много, минимум три могу предложить
    * правильный - настроить службу и прописать ей зависимости и автозапуск,
    * так же до сих пор есть устаревший способ настройки службы без зависимостей sysvinit - /etc/init.d
    * ну еще есть /etc/rc.local
    Ответ написан
    1 комментарий