Я пишу конечный автомат Тамагочи. Требуется, что бы одновременно с вводом команд в определенном месте экрана печатались его параметры. Есть класс, в котором есть функции, исполняемые в основном потоке, и поля.
//заголовок "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){
Далее идет отдельная логика программы. Но на деле получается вот так:
Я понимаю, что все дело скорее всего в синхронизации 2-х потоков, тк они одновременно занимают ввод и вывод и каретка сдвигается. Как реализовать, что бы все изменялось в начале терминала и при движении логики основного потока вывод потока
thread
не копировался? За ранее спасибо.
Понимаю, что из приведенных обрывков может быть не все понятно. Оставляю ссылку на гитхаб:
https://github.com/tupostudentok/Tamagothi.git