我在Mac系统下使用xcode。
我想用c ++在控制台中模拟falling code。
我的设计是每个下降的代码链都是一个对象,它有一个包含系统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] = '\0';
}
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]) != '\0') {
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对象,意味着只运行一个线程,它就可以工作。我可以看到一个下降的代码链。
但是,如果我添加一个线程,就像上面的代码一样,一切都会被搞砸。我到处都可以看到代码。似乎我遇到了同步问题,但我无法理解。
答案 0 :(得分:0)
move(x + i + n, y)
printw("%c", ch);
必须锁定两条线。否则就会出现同步问题。