Console C ++中的多线程定时器和I / O.

时间:2016-03-14 00:48:16

标签: c++ multithreading timer io

我正在开发一个游戏,其中有一个单词落在屏幕的底部,用户在它触到底部之前键入该单词。因此,当单词下降时,您将能够输入输入。现在我有一个等待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次。那么关于如何正确地做到这一点的任何建议?我已经做过研究了。我检查过的一些链接没有帮助:

Multithreaded console I/O

C++11 Multithreading: Display to console

Render Buffer on Screen in Windows

Threading console application in c++

Create new console from console app? C++

Console output from thread

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, &current_time) < 1000)
        {
            _ftime_s(&current_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
        );
}

1 个答案:

答案 0 :(得分:1)

线程不以任何特定顺序运行 - 操作系统可以随时调度它们。你的代码开始十个线程 - 五个打印“Hello”,五个打倒。因此,最有可能的结果是您的程序将尝试同时打印“Hello”五次,并同时倒计时五次

如果您想按特定顺序执行操作,请不要在单独的线程中执行所有操作。只需要一个线程以正确的顺序完成任务。