c++:使用多线程在控制台中移动光标

c++: move cursor in console with multithreading

本文关键字:控制台 移动 光标 多线程 c++      更新时间:2023-10-16

我在Mac系统下的xcode中工作

我想用c++在控制台中模拟下降代码

我的设计是,每个下降的代码链都是一个对象,它有一个包含系统API的函数来移动光标。使用多线程,我可以模拟一些下降的代码链

这是我的代码:

// CodeChain.h
class CodeChain
{
public:
    CodeChain(int, int);
    void setx(int);
    void sety(int);
    void show();
    std::thread threadShow();
private:
    char codes[256];
    int x, y;
};

//CodeChain.cpp
CodeChain::CodeChain(int ax, int ay) : x(ax), y(ay)
{
    codes[0] = 'a';
    codes[1] = 'b';
    codes[2] = 'c';
    codes[3] = 'd';
    codes[4] = '';
}
void CodeChain::show()
{
    int i = 0;
    char ch;
    int n = 0;
    while (true) {
        move(x + n - 1, y);
        printw("%c", ' ');
        i = 0;
        while ((ch = codes[i]) != '') {
            move(x + i + n, y);
            printw("%c", ch);
            ++i;
        }
        n++;
        refresh();
        sleep(1);
    }
}
std::thread CodeChain::threadShow()
{
    return std::thread([=] { show(); });
}

void CodeChain::setx(int ax)
{
    x = ax;
}
void CodeChain::sety(int ay)
{
    y = ay;
}

// main.cpp
int main(int argc, char *argv[]) {   
    initscr();
    start_color();
    CodeChain cc0(5, 1);
    CodeChain cc1(5, 2);
    std::thread t0 = cc0.threadShow();
    std::thread t1 = cc1.threadShow();
    t0.join();
    t1.join();

    return 0;
}

如果CodeChain只有一个对象,也就是说只有一个线程在运行,那么它就可以工作。我可以看到一个正在下降的代码链。

然而,如果我添加一个线程,就像上面的代码一样,所有的东西都会堆积起来。我到处都能看到代码。我似乎遇到了一个同步问题,但我想不通。

move(x + i + n, y)
printw("%c", ch);

这两条线必须锁定。否则将出现同步问题。