c++:使用多线程在控制台中移动光标
c++: move cursor in console with multithreading
我在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);
这两条线必须锁定。否则将出现同步问题。
相关文章:
- 将对象移动到std::shared_ptr
- 何时在引用或唯一指针上使用移动语义
- C++:将控制台输出存储在宏中更好吗
- 如何从具有移动语义的类对象中生成共享指针
- 将shared_ptr移动到<StructA>shared_ptr<变体<结构A、结构 B>>
- C / C++ 移位/偏移/向左或向右移动位图?
- 在while循环中输入带有std::cin的字符串后,控制台会输出大量胡言乱语
- SSH通过/sbin/SSH无法读取RSA密钥文件(从控制台运行)
- MSVC将仅移动结构参数解释为指针
- C++控制台应用程序阻止退出
- 如何修复此iFile以将.txt输出到控制台
- 为什么控制台要求输入,即使代码中没有输入
- 自定义先决条件对移动分配运算符有效吗
- Win32 API 控制台光标在 WriteConsole 后不移动
- 有没有办法像动画一样移动控制台窗口?
- 在控制台C 中移动字母
- 将函数从控制台应用程序移动到共享库项目似乎会带来不相关的编译错误
- 在控制台C++中移动图形
- 将光标移动到控制台的左下角
- 在控制台应用程序和ssh中的鼠标移动