1

我在一个多线程程序中有一个永远运行的事件循环,很多函数和方法会将消息推送到这个事件循环。简化版:

class EventLoop {
public:
    void run();
private:
    std::deque<std::string> m_msg_queue;
    std::condition_variable m_q_cv;
    std::mutex m_q_mtx;
};

void EventLoop::run() {
     while(true) {
         //use m_q_cv to wait for data in m_msg_queue and dispatch
     }
}

int main() {
    EventLoop el;
    el.run();
    return 0;
}

这种方法正确吗?如果是这样,在除 main() 之外的其他函数/方法中将事件排入队列的最佳方法是什么?我不喜欢extern Event el在其他 .cpp 文件中做...

4

2 回答 2

2

定义一个合约,用于在事件循环中发布或发送消息并对接收到的事件做出反应。一个典型的 API 至少会公开发送/发布过程对以及某种消息契约和一种连接回调的机制。然后公开这个合约而不是你的实现,它可能隐藏在库中。

于 2013-05-21T22:06:37.513 回答
1

在标题中定义您EventLoop的内容,并将其包含在需要它来获取定义的其他文件中。

EventLoop然后给需要它的类引用或指向您在 中创建的实例的非拥有指针main()。例如,它们可以在构造函数中传递或通过 setter 方法设置。

这里不需要有任何全球性的东西。

当您有大量类时,您也可以让它们从处理事件处理的公共基类继承,有点像这样:

class EventSource {
    EventLoop* _eventLoop;
protected:
    // Puts a message on the message queue of the event loop.
    void sendMessage(std::string message);
public:
    EventSource(EventLoop *eventLoop);
}

class Subclass : public EventSource {
public:
    Subclass(EventLoop* loop);
}

您仍然会将指针传递给子类的构造函数,但基类负责实际通信。

于 2013-05-21T21:38:01.080 回答