树梅派硬件学习_多线程任务

Posted Leslie X徐

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了树梅派硬件学习_多线程任务相关的知识,希望对你有一定的参考价值。

C++类中的多线程编程

目标

需要将成员函数变成线程函数
步骤:
1.创建一个类
在类中定义一个开启关闭线程的flag
将要加入线程的成员函数定义为static静态函数

#include <thread>
class Myclass
{
	bool flag=false;
public:
	Myclass(){}
	static void func(void* arg);
	void start();
	void stop();
};

2.定义线程执行函数

void Myclass::func(void* arg)
{
	Myclass* myclass = static_cast<Myclass*>(arg);
	while(myclass->flag == true){
		//循环体
	}
}

3.start函数开启线程,将当前的类this指针传进去

void Myclass::start()
{
	this->flag = true;
	std::thread th = std::thread(func,this);
	th.detach();
	
}

4.stop函数关闭线程

void Myclass::stop()
{
	this->flag = false;
}

实例

实现小灯闪烁的线程函数
头文件

#ifndef LED_LOOP_H
#define LED_LOOP_H

#include <QObject>
#include <thread>
#include "../include/LED.h"

class LED_Loop : public QObject
{
    Q_OBJECT
private:
    LED *led;
    char ledpin;
    bool loopFlag=false;

public:
    explicit LED_Loop(QObject *parent = nullptr);
    LED_Loop(char pin);
    static void led_loop(void* arg);
    void loop_start();
    void loop_stop();
signals:

public slots:
};

#endif // LED_LOOP_H

定义

#include "led_loop.h"

LED_Loop::LED_Loop(QObject *parent) : QObject(parent)
{

}

LED_Loop::LED_Loop(char pin)
{
    this->led = new LED (pin);
}

void LED_Loop::led_loop(void *arg)
{
    LED_Loop* ledloop = static_cast<LED_Loop*>(arg);

    while(ledloop->loopFlag==true){
       ledloop->led->on();
       delay(1000);
       ledloop->led->off();
       delay(1000);
    }
    return;
}

void LED_Loop::loop_start()
{
    this->loopFlag = true;
    std::thread th = std::thread(led_loop,this);
    th.detach();
}

void LED_Loop::loop_stop()
{
    this->loopFlag = false;
}

以上是关于树梅派硬件学习_多线程任务的主要内容,如果未能解决你的问题,请参考以下文章

树梅派硬件学习_L298N模块驱动

树梅派硬件编程_ADC

树梅派硬件编程_按键中断

树梅派硬件编程_QT_OLED显示字符

树梅派硬件编程_超声波测距

树梅派硬件编程_红外遥控器