我在C ++中创建了一个登录命令行界面,其中一个选框将无限期运行,在下一行中,用户可以输入他的ID和密码。我希望这两个工作,即同时输入marquee和id输入,但只有下面的代码只有marquee运行无限时间。我正在使用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");
}
答案 0 :(得分:1)
首先,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;
}