我正在开发一个游戏,其中有一个单词落在屏幕的底部,用户在它触到底部之前键入该单词。因此,当单词下降时,您将能够输入输入。现在我有一个等待5秒的计时器,打印单词,再次运行计时器,清除屏幕,并打印10个单位的单词。
int main()
{
for (int i = 0; i < 6; i++)
{
movexy(x, y);
cout << "hello\n";
y = y + 10;
wordTimer();
}
}
我知道非常基本。这就是为什么我认为多线程是一个好主意,所以当我仍然在底部键入输入时,我可以让单词下降。到目前为止,这是我的尝试:
vector<std::thread> threads;
for (int i = 0; i < 5; ++i) {
threads.push_back(std::thread(task1, "hello\n"));
threads.push_back(std::thread(wordTimer));
}
for (auto& thread : threads) {
thread.join();
}
然而,这仅向屏幕打印hello 4次,然后打印55,然后再次打印hello,然后再计数3次。那么关于如何正确地做到这一点的任何建议?我已经做过研究了。我检查过的一些链接没有帮助:
C++11 Multithreading: Display to console
Render Buffer on Screen in Windows
Threading console application in c++
Create new console from console app? C++
https://msdn.microsoft.com/en-us/library/975t8ks0.aspx?f=255&MSPPError=-2147217396
http://www.tutorialspoint.com/cplusplus/cpp_multithreading.htm
编辑: 这是wordTimer()
int wordTimer()
{
_timeb start_time;
_timeb current_time;
_ftime_s(&start_time);
int i = 5;
for (; i > 0; i--)
{
cout << i << endl;
current_time = start_time;
while (elapsed_ms(&start_time, ¤t_time) < 1000)
{
_ftime_s(¤t_time);
}
start_time = current_time;
}
cout << " 5 seconds have passed." << endl;
return 0;
}
这对于wordTimer()
也是必要的unsigned int elapsed_ms(_timeb* start, _timeb* end)
{
return (end->millitm - start->millitm) + 1000 * (end->time - start->time);
}
和task1
void task1(string msg)
{
movexy(x, y);
cout << msg;
y = y + 10;
}
和void movexy(int x,int y)
void movexy(int column, int line)
{
COORD coord;
coord.X = column;
coord.Y = line;
SetConsoleCursorPosition(
GetStdHandle(STD_OUTPUT_HANDLE),
coord
);
}
答案 0 :(得分:1)
线程不以任何特定顺序运行 - 操作系统可以随时调度它们。你的代码开始十个线程 - 五个打印“Hello”,五个打倒。因此,最有可能的结果是您的程序将尝试同时打印“Hello”五次,并同时倒计时五次。
如果您想按特定顺序执行操作,请不要在单独的线程中执行所有操作。只需要一个线程以正确的顺序完成任务。