Остановка бесконечного цикла по вводу ключевого слова
-
Не нужно повторять вопросы. Я уже дал ответ на этот вопрос.
Если вы совсем новичёк в программировании, то я могу дать полный текст примера на питоне. Но всё очень просто и так...
-
@sv-lary#6601 напишите пожалуйста код примера
-
@sv-lary#6601 вопрос повторил, потому что на обоих языках нужна реализация
-
> @Sailwork#6603 вопрос повторил,
На выходные сделаю...
-
На С:
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <pthread.h> // Флаг продолжения обработки в главном цикле int flag; // Функция управляет циклом основной обработки void * comander(void *param) { char buf[32]; puts("Нить запущена"); while(1) { fgets(buf, 31, stdin); if (strncmp(buf, "exit", 4) == 0) { puts("Останавливаю процесс обработки"); flag = 0; } } return NULL; } // Главная функция программы int main(int argc, char *argv[]) { pthread_t thread; pthread_attr_t attr; int rc; puts("Запускаю процесс управления"); flag = 1; pthread_attr_init(&attr); rc = pthread_create(&thread, &attr, comander, NULL); while (flag) { puts("Работаю..."); sleep(1); } puts("Работа завершена!"); return 0; }
-
Исходный текст на питоне. Тут есть тонкость... Потоки (Thread) в питоне реализованы не очень адекватно. Поэтому, если в С-программе один поток ВЫВОДИЛ на консоль, а другой, в это же самое время ВВОДИЛ и всё это нормально работало, то в питоне такого нет.
Максимум, что я успеваю ввести во время секундной паузы вывода - одну букву. Поэтому здесь командой выхода из цикла является не слово "exit", а буква 'q':
import threading import time flag = True def controller(): """Функция ожидания команды остановки""" global flag # Бесконечный цикл ввода команд while True: in_str = input() print("Ввели '{}'".format(in_str)) if in_str == 'q': # Введена команда останова? flag = False return """Главная функция программы""" # Запускаем нить управления t = threading.Thread(target=controller) t. start() # Основной цикл обработки while flag: # Просто что-то делаем... Ну, хотя бы - спим! time.sleep(1) print("Я работаю...")
-
Спасибо большоое, пока буду разбираться в том, что вы написали. Но я немного не ожидал, что то, что не работает в обычной вижле на виндовс будет работать на rasberry pi(Linux). Я уже думал, что мне нужно будет скачивать на мою расберри библиотеки, а потом мучаться с их подключением, но как только я вставил код в расберри - все без ошибок заработало. Где можно узнать про основные отличия в работе с кодом(программировании на с++ или Python) и с библиотеками на windows и на Linux (raspberry pi) и какие библиотеки имеются в линуксовских(raspberry pi) ide? Очень бы хотелось научится кодить под Linux (raspberry pi) на с++ и питоне
-
> @Sailwork#6607 Где можно узнать про основные отличия в работе с кодом(программировании на с++ или Python)
Если у вас с английским ОК, то лучше всего смотреть фирменное издательство "Малинки". Там очень много книг по разным темам:
https://magpi.raspberrypi.org/books
Там есть серия книг под общим названием "Raspberry Pi Projects" в которых описываются многочисленные варианты использования малинки. Есть книги и по конкретным темам.
Например, про С на малинке: https://magpi.raspberrypi.org/books/essentials-c-v1
Или про GUI на Python: https://magpi.raspberrypi.org/books/create-guisЕсли с английским тяжко, то бы рекомендовал начать с отличной книги:
"Raspberry Py Сбоник рецептов". Саймон Монк. O'Reily
Вышло уже два, а может и три издания. Иесть в бумажном и электронном виде.
-
А эта книга для Си, а если я хочу писать код на плюсах? Там же все таки отличия есть в командах(например классах и объектах) или под Linux(расберри) все равно и функционал у них одинаковый?
-
Когда я создал проект из шаблона на с++ возникли ошибки. Что не так?[upl-image-preview url=https://raspberrypi.ru/forum/assets/files/2021-05-22/1621680590-820543-2021-05-22-134815-1920x1080-scrot.png]
-
> @Sailwork#6609 А эта книга для Си, а если я хочу писать код на плюсах?
Специальной книжки по плюсам для малинки я не знаю. Думаю, что нет большого различия. Но я не считаю, что плюсы - хороший вариант для малинки. Если приложение большое и сложное - надо писать на С, что бы не давать лишнюю нагрузку на систему. Если приложение простое - пишите на питоне - дёшево и сердито
-
> @Sailwork#6610 возникли ошибки
Существует такое правило, практически на всех форумах, типа этого: НИКОГДА не используйте скриншоты. Всё должно быть исключительно в текстовом виде, а особенно - сообщения об ошибках. Что бы отвечающий мог легко откопипастить куски кода, сообщения об ошибках и т.д. и найти решение.
Насколько я смог разглядеть вашу картинку (после мучительного изучения) у вас не линкуется главная программа с библиотекой libpthread. Наиболее веротная причины - вы не указали эту библиотеку в параметрах компилятора. Попробуйте вот так:
g++ main.cpp -lpthread
-
Я принял к сведению, спасибо, все заработало. Случаем не знаете как понять, какие библиотеки нужно указывать в параметрах компилятора, а какие нет? И еще, не могу понять, зачем у вас в коде на си библиотека std.lib?
-
> @Sailwork#6613 какие библиотеки нужно указывать в параметрах компилятора, а какие нет?
Для этого во всех *NIX системах имеется команда 'man' - 'manual'. Например, в своей программе Вы используете ф-цию pthread_create() Что бы узнать, в какой библиотеке содержится эта функция и какой флаг компоновки надо использовать, выполняем команду:
man pthread_create
И видим ответ#include <pthread.h> Compile and link with -pthread.
> @Sailwork#6613 зачем у вас в коде на си библиотека std.lib?
Я начинал писать программу из шаблона, в котором этот инклюд есть. Проверять - нужен он или нет я не стал, т.к. если он не нужен, то он просто проигнорируется компилятором.