C ++ - 在main()方法内的类实例中创建一个线程并调用Sleep()

时间:2017-03-31 01:19:36

标签: c++ multithreading thread-sleep

所以我想创建一个线程,让我的程序部分可以相互独立运行。 (唯一的另一种方法是创建一个基于事件的计时器,我没有时间)。

我可以在我的应用程序的main方法(入口点)中创建一个线程,它可以按预期工作。也就是说,当我将我的线程附加到位于我的主源文件中的函数时。它将在一个单独的线程中调用该函数,因此我可以通过我的程序在该函数中调用Sleep()将继续执行该线程之外的代码。

#include "stdafx.h"
#include <thread>
#include <windows.h>
#include <iostream>
#include <thread>

void makeThread()
{
    while (true)
    {
        Sleep(2000);
        printf("thread print");
    }
}  

int main()
{
    std::thread th(&makeThread);
    printf("normal print");
    int x;
    std::cin >> x;
}

此代码在打印“线程打印”之前将打印“普通打印”。但是当我尝试在我在Main类中实例化的类中创建一个线程时,情况并非如此。我注意到它强制我加入线程,如果它不在主类中,结果,我无法单独执行逻辑。如何在类中正确调用sleep(),以便只有我创建的线程才会睡眠,而不是主线程?这是我在main()使用的类中创建的线程的代码。

Alarm::Alarm(int cID, int port, string fileName) : ClientObserver(cID, port, fileName)
{
    std::thread th(&Alarm::runLoop, this);
    th.join();
}

void Alarm::runLoop()
{
    while(true)
    {
        bRaiseAlarm = true;
        Sleep(3500);
        if(bRaiseAlarm == true)
        {
            //Sound the alarm
            alarmStep = alarmStep >= 3 ? 1 : alarmStep + 1;
            printf("\nALARM FOR %c with alarm number: %i\n", fileName.c_str(), alarmStep);
            bRaiseAlarm = false;
        }
    }
}

在下面的代码中,只执行while(true)循环,并且由于Sleep()

,我的程序其余部分的功能暂停

1 个答案:

答案 0 :(得分:0)

创建指向线程的指针是第一步。指针是必需的,因为变量th超出了范围。加入线程以某种方式解决了问题。摆脱那条线解决了这个问题。