我试图同时执行两个操作,一个是在程序的 main 方法中打印出 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
我可能遗漏了什么?
最佳答案
这应该可以正常工作。
#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 而不是 Windows 中的 sleep 。
关于c++ - 从类中运行线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56222370/