Запуск потоков из классов - PullRequest
1 голос
/ 20 мая 2019

Я пытаюсь выполнить две операции одновременно: цикл в основном методе программы, который выводит Tick from main, и другой цикл в классе, который выводит Tick from ConnectionManager.

Этот конкретный фрагмент кода, который я запускаю, взят из одного из заданных здесь вопросов.

Файл main.cpp:

#include <Windows.h> // printf, Sleep
#include <thread> // thread

// Include Connection Manager
#include "ConnectionManager.h"

int main() {
    ConnectionManager _CM;

    while (1) {
        printf("Tick from main");
        Sleep(1500);
    }
}

connectionmanager.h

#pragma once
class ConnectionManager
{
private:
    void LoopForData();
public:
    ConnectionManager();
};

ConnectionManager.cpp

#include "ConnectionManager.h"

#pragma once
#include <Windows.h>
#include <thread>

void ConnectionManager::LoopForData() {
    while (1) {
        printf("Tick from connection manager\n");
        Sleep(1500);
    }
}

ConnectionManager::ConnectionManager()
{
    std::thread tobj(&ConnectionManager::LoopForData, this);
}

Ожидаемое поведение - оба цикла запускаются одновременно, однако вывод, который я получаю на консоли, происходит только из функции LoopForData, и я получаю следующее сообщение об ошибке: https://imgur.com/a/WO5AKE8

Чего мне не хватать?

1 Ответ

2 голосов
/ 20 мая 2019

Это должно работать нормально.

#include <iostream>
#include <thread>
#include <chrono>

//ConnectionManager.h
class ConnectionManager
{
private:
    std::thread tobj;
public:

    ConnectionManager();
    ~ConnectionManager();
private:
    void LoopForData();
};
//ConnectionManager.cpp
#include "ConnectionManager.h"

void ConnectionManager::LoopForData(){
    while (1) {
        std::cout << "Tick from connection manager" << std::endl;
        std::this_thread::sleep_for (std::chrono::milliseconds(1500));
    }
}
ConnectionManager::~ConnectionManager(){
    if(tobj.joinable()){
        tobj.join();
    }
}
ConnectionManager::ConnectionManager() : tobj(&ConnectionManager::LoopForData, this){

}
//main.cpp

#include "ConnectionManager.h"
int main() {
    ConnectionManager _CM;

    while (1) {
        std::cout << "Tick from main" << std::endl;
        std::this_thread::sleep_for (std::chrono::seconds(1));
    }
}

Я думаю, что ваша основная проблема была связана с выходом tobj из области видимости при выходе из конструктора.Также вы можете использовать стандартный сон c ++ вместо Sleep from Windows.

...