我在C ++中创build了一个login命令行界面,其中一个选取框将无限期地运行,并且在下一行中用户可以input他的标识和密码。 我希望这两个工作,即字幕和身份证input在同一时间,但与下面的代码只有选框运行无限的时间。 我正在使用Windows操作系统,我是新来的C ++,所以我无法应用线程概念。
char m[]={"- A cool marquee effect. Programmed by Roneet -"}; int main() { marquee(); cout<<setw(35)<<"Enter Username : "; getline(cin,str); cout<<setw(35)<<"Enter Password : "; return 0; } void marquee() { while(a<131) { p=m[0]; m[0]=m[c]; m[c]=p; for(j=1;j<=b;j++) cout<<m[j]; for(j=0;j<N;j++){} c--; cout<<"\r"; if(c<1){c=b;a++;if(a==100)N=51500;} } system("PAUSE"); }
首先,std流不是线程安全的,你需要添加std::mutex
来保护每个std::cout
操作。
其次,为了在一个单独的线程中轻松地执行一个函数,使用std::async
#include <future> std::future<void> fut = std::async(&marquee);
例:
#include <atomic> #include <future> #include <string> #include <iostream> std::atomic<bool> cond{ false }; void marquee() { while (!cond) { std::cout << '*' << std::flush; } } int main() { std::ios_base::sync_with_stdio(false); std::cin.tie(nullptr); std::cerr.tie(nullptr); std::cout << "Enter username and then password: " << std::flush; std::future<void> task = std::async(std::launch::async, &marquee); std::string user, pass; std::cin >> user >> pass; cond = true; task.get(); return 0; }