Nano Hash - криптовалюты, майнинг, программирование

Curses printw() будет печатать новую строку только при вводе строки, полученной из сети.

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

Проблема в том, что в настоящее время я пытаюсь запустить два потока; поток GUI ожидает срабатывания клавиатуры и, когда это произойдет, создаст сообщение в памяти. Когда нажата клавиша ввода, это передается потоку сервера, который передает его по сети.

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

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

char* messageRcv;
messageRcv = stream_rcv_nblock(stream);

if(messageRcv != NULL) {
    if(messageRcv[0] != '\xFF') {
        printw("%s", messageRcv);
        refresh();
    }

    free(messageRcv);
}

Это код, который теоретически должен отображать сообщение. Для справки, 0xFF на данный момент действует как код «соединение закрыто». Быстро и грязно, но сейчас очень рано, так что мне все равно.

Любая помощь в этом вопросе будет принята с благодарностью, так как у меня ничего нет. Спасибо.

РЕДАКТИРОВАТЬ: printw() использует строку формата "%s", однако ошибка все еще возникает.


  • Это псевдокод, потому что он неверен? Printw похож на printf тем, что принимает строку формата, а затем параметры. Вы уверены, что новая строка, которую вы испытываете, не находится в самом сетевом потоке, и вы неосознанно распечатываете ее, потому что не проверяете ее? 27.09.2013
  • Если бы это было так, я бы, конечно, вывел строку\n, а не просто \n? Кроме того, printw работает точно так же, в данном случае, со строкой формата как %s, и, насколько мне известно, как показано здесь... 27.09.2013
  • Вы уверены, что messageRcv содержит полную завершающую строку '\0'? Попробуйте напечатать messageRcv[0..n] в виде десятичных знаков или длины строки. Вы, вероятно, получили '\ 0', которого не ожидаете. 01.10.2013

Ответы:


1

Скорее всего, проблема в том, что ваша строка содержит последовательности CR-LF в конце каждой строки.

Когда addch (который используется printw) запрашивается для вывода новой строки, он сначала выполняет clrtoeol, а затем перемещает курсор на следующую строку. Поскольку CR сбрасывает позицию курсора на левое поле, вывод clrtoeol NL сотрет все символы в только что напечатанной строке.

Насколько мне известно, нет другого способа победить это поведение, кроме удаления CR из вывода.

13.05.2015
Новые материалы

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

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

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