Задать вопрос
@pynew_user

Как организовать работу printf в отдельном потоке?

Я пишу конечный автомат Тамагочи. Требуется, что бы одновременно с вводом команд в определенном месте экрана печатались его параметры. Есть класс, в котором есть функции, исполняемые в основном потоке, и поля.

//заголовок "Tamagocthi.h"
class Tamagotchi {
    int HEAL_POINTS = 100;
    int FATIGUE_POINTS = 0;
    int HAPPINESS_POINTS = 100;


Большинство функций класса работают в main потоке , изменяют, выводят и тд. Но требуется, что бы о отдельном потоке thread работала другая функция, которая тоже изменяет, но выводит нужные данные в конкретном месте.
Вот функция:

//заголовок "Tamagotchi.h"
void getTam(){
    
    while(true){
        mutex mutTam;
        TamagotchiView View;
        {             
            lock_guard<mutex> guard(mutTam);
            HEAL_POINTS-=1;
            printf("\rУровень жизни: %d\t", HEAL_POINTS);

            FATIGUE_POINTS+=1;
            printf("Уровень скуки: %d\t", FATIGUE_POINTS);

            HAPPINESS_POINTS-=1;
            printf("Уровень счастья: %d", HAPPINESS_POINTS);
            //View.printTamagotchi(HAPPINESS_POINTS, FATIGUE_POINTS, HEAL_POINTS);

            fflush(stdout);
        }
            this_thread::sleep_for(chrono::seconds(20));
    }

}


Эта функция должна перепечатывать строки каждые 20 секунд не мешая параллельному вводу/выводу. Ее вызов:
int main() {
printf("\e[8;%d;%d;t", 30, 120); // вывод консоли с размерами 30х120
fflush(stdout);
system ("clear");

enum command_code { FEED, SLEEP, WALK, DRINK, CARESS, HELP, EXIT, INPUT_COMMAND };   
int  command;
string line;

cout << "Привет! Меня зовут Роберт, чем мы будем заниматься? " << endl;

Tamagotchi Robert;
thread RoberPoints(&Tamagotchi::getTam, ref(Robert));
RoberPoints.detach();
this_thread::sleep_for(chrono::microseconds(1));

mutex mcin;
command = INPUT_COMMAND; // присвоение начального состояния 


cout << "\nSTART:" << endl; // вывод макросов
cout << LINE20 << endl;


cout << OUTPUT << "Для ознакомления с командами введите HELP" << endl;
while(true){

Далее идет отдельная логика программы. Но на деле получается вот так:
hrrJC.png

Я понимаю, что все дело скорее всего в синхронизации 2-х потоков, тк они одновременно занимают ввод и вывод и каретка сдвигается. Как реализовать, что бы все изменялось в начале терминала и при движении логики основного потока вывод потока thread не копировался? За ранее спасибо.

Понимаю, что из приведенных обрывков может быть не все понятно. Оставляю ссылку на гитхаб: https://github.com/tupostudentok/Tamagothi.git
  • Вопрос задан
  • 115 просмотров
Подписаться 2 Средний 1 комментарий
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы