c++,一个线程,对外提供一个槽函数,当这个槽函数被调用的时候,线程休眠一段时间

1.概要

1.要点

2.相关链接

c++ 线程交叉场景试验-优快云博客

c++,一个线程,对外提供一个槽函数,当这个槽函数被调用的时候,线程休眠一段时间-优快云博客

qt 我想让一个udp线程休眠一段时间,休眠后只处理最新的数据,休眠期间的缓存数据我不要了-优快云博客 qt 一个线程让另一个线程休眠,可以吗-优快云博客

使用 Qt 的 moveToThread 方法创建的线程,如何让线程休眠-优快云博客 

qt 如何让一个udp线程休眠-优快云博客 

qt 的udp线程休眠期间,通讯的缓存会怎样-优快云博客 

如何让一个使用 Qt 的 moveToThread 方法创建的udp线程休眠,且休眠期间的缓存数据自动丢弃-优快云博客

QUdpSocket可以主动删除缓存的数据吗-优快云博客 

qt,一个线程,对外提供一个槽函数,当这个槽函数被调用的时候,线程休眠一段时间-优快云博客

2.内容

在C++中,你可以使用线程和信号槽机制来实现你的需求。这里我们将使用C++11标准库中的线程和互斥锁,以及Qt框架中的信号槽机制来示范如何实现这个功能。如果你不使用Qt,你可以替换信号槽部分为其他事件处理机制,比如条件变量。

首先,确保你已经安装了Qt,并且配置好了Qt开发环境。

下面是一个示例代码,展示了一个线程类,该类提供一个槽函数,当槽函数被调用时,线程会休眠一段时间。

#include <QCoreApplication>
#include <QThread>
#include <QObject>
#include <QMutex>
#include <QDebug>
#include <chrono>
#include <thread>

class Worker : public QObject {
    Q_OBJECT

public slots:
    void sleepForDuration() {
        qDebug() << "Sleeping for 3 seconds";
        std::this_thread::sleep_for(std::chrono::seconds(3));
        qDebug() << "Woke up!";
    }
};

class MyThread : public QThread {
    Q_OBJECT

public:
    MyThread(QObject *parent = nullptr) : QThread(parent) {
        worker = new Worker;
        worker->moveToThread(this);
    }

    ~MyThread() {
        worker->deleteLater();
    }

signals:
    void requestSleep();

public slots:
    void startWork() {
        exec();
    }

protected:
    void run() override {
        // Event loop
        exec();
    }

private:
    Worker *worker;
};

int main(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);

    MyThread thread;
    QObject::connect(&thread, &MyThread::requestSleep, thread.worker, &Worker::sleepForDuration);

    thread.start();

    // Emit the signal to request sleep
    emit thread.requestSleep();

    return a.exec();
}

#include "main.moc"

解释

  1. Worker 类
    • 这是一个 QObject 子类,包含一个槽函数 sleepForDuration,当这个槽函数被调用时,线程会休眠3秒。
  2. MyThread 类
    • 继承自 QThread,并且包含一个 Worker 对象。
    • Worker 对象被移动到这个线程中,以确保槽函数在正确的线程中执行。
    • 定义一个信号 requestSleep,当这个信号被发射时,会调用 Worker 对象的 sleepForDuration 槽函数。
  3. main 函数
    • 创建 QCoreApplication 对象。
    • 创建 MyThread 对象,并将 requestSleep 信号连接到 Worker 对象的 sleepForDuration 槽函数。
    • 启动线程,并发射 requestSleep 信号以触发槽函数。

注意事项

  • 确保你已经安装并配置好了Qt开发环境。
  • 使用 QThread 时,要小心对象生命周期和线程同步问题。
  • 如果你不使用Qt,可以使用C++11标准库中的 std::thread 和 std::condition_variable 来实现类似的功能。

希望这个示例能够帮助你理解如何在C++中实现一个线程,并在该线程中提供一个槽函数,当槽函数被调用时线程休眠一段时间。

3.关联知识

1.std::this_thread::sleep_for

std::this_thread::sleep_for 是 C++11 标准库中的一个函数,用于使当前线程休眠一段时间。这个函数属于 <thread> 头文件,并且位于 std::this_thread 命名空间中。

函数原型如下:

namespace std {
    namespace this_thread {
        template <class Rep, class Period>
        void sleep_for(const std::chrono::duration<Rep, Period>& rel_time);
    }
}

这里,rel_time 是一个 std::chrono::duration 对象,表示线程应该休眠的时间长度。std::chrono::duration 是一个模板类,用于表示时间段,它接受两个模板参数:Rep 表示时间的数值类型(如整数或浮点数),Period 表示时间单位(如秒、毫秒等)。

例如,如果你想让当前线程休眠3秒,你可以这样写:

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

int main() {
    std::cout << "Starting to sleep..." << std::endl;
    std::this_thread::sleep_for(std::chrono::seconds(3));
    std::cout << "Woke up!" << std::endl;
    return 0;
}

在这个例子中,std::chrono::seconds(3) 创建了一个表示3秒的 std::chrono::duration 对象,然后 std::this_thread::sleep_for 函数使当前线程休眠这段时间。

std::this_thread::sleep_for 函数是阻塞的,意味着在休眠期间,当前线程不会执行任何代码,也不会响应任何事件。当休眠时间结束时,线程会继续执行紧接着 sleep_for 调用之后的代码。

这个函数在需要让线程等待一段时间而不需要执行任何操作时非常有用,比如在模拟、等待外部事件或简单的延时操作中。然而,在多线程编程中,过度使用阻塞调用可能会导致线程饥饿、死锁或其他并发问题,因此应该谨慎使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值