21xrx.com
2024-11-05 16:31:39 Tuesday
登录
文章检索 我的文章 写文章
"C++ 子线程如何调用主线程函数"
2023-06-29 12:36:06 深夜i     --     --
C++ 子线程 调用 主线程函数 多线程编程

在 C++ 中,多线程编程可以满足很多需要同时执行的任务。然而在多线程编程中,我们常常会遇到不同线程之间数据交互的问题。例如,在子线程中执行某个任务后,需要调用主线程的函数来更新界面或者处理相关数据。那么,C++ 子线程如何调用主线程函数呢?

在 C++ 中,主线程和子线程之间的通信最好采用消息机制。主线程用一个消息队列来存放消息,每个消息都对应着一个函数的调用。当子线程需要调用主线程函数时,它可以创建一个消息,并将这个消息放入主线程的消息队列中。主线程会不停地取出消息,并执行对应的函数调用。

具体来说,我们可以在主线程中创建一个消息队列,该队列负责存放所有的消息。当子线程需要调用主线程的函数时,它可以利用主线程的消息队列来实现。具体步骤如下:

1. 在主线程中创建一个消息队列,该队列用于存放所有的消息;

2. 在子线程中创建消息,并将这个消息放入主线程的消息队列中;

3. 主线程会不停地取出消息,并执行对应的函数调用。

可以使用以下代码来实现上述步骤:


#include <thread>

#include <condition_variable>

#include <queue>

#include <functional>

template<typename T>

class MessageQueue {

public:

  void send(T&& msg) {

    std::unique_lock<std::mutex> lock(_mutex);

    _queue.push(std::forward<T>(msg));

    _cond.notify_one();

  }

  

  T receive() {

    std::unique_lock<std::mutex> lock(_mutex);

    _cond.wait(lock, [this] { return !_queue.empty(); });

    T msg = std::move(_queue.front());

    _queue.pop();

    return msg;

  }

private:

  std::mutex _mutex;

  std::condition_variable _cond;

  std::queue<T> _queue;

};

// 主线程

int main() {

  MessageQueue<std::function<void()>> mq;

  // 创建子线程

  std::thread t([&mq]() {

    // 子线程执行的函数

    // ...

    // 通过消息队列调用主线程函数

    mq.send([]()

      // 主线程函数

    );

  });

  // 循环取出消息并调用对应的函数

  while (true) {

    auto msg = mq.receive();

    msg();

  }

  // 等待子线程结束

  t.join();

  return 0;

}

总的来说,C++ 子线程如何调用主线程函数的方法主要有两种,一种是使用 Windows API 中的 PostThreadMessage 函数,另一种是采用上述消息队列的方法。不同的方法有各自的优缺点,具体选择需要根据项目需求和开发者的经验来决定。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复