gpt4 book ai didi

c++ - 将 Qt 信号转换为 boost 信号2

转载 作者:太空狗 更新时间:2023-10-29 21:44:17 27 4
gpt4 key购买 nike

我有以下在 Qt 中实现 Signal/Slot + Concurrency 的代码,想知道我是否可以将其转换为 Boost/Threads 和 Boost/signal2

 void MyClass::Func1() 
{
emit ImplementingFunc1();
//Do the stuff here
Func1Implementation()

QFuture<void> future = QtConcurrent::run(this, &MyClass::WaitForFunc1Finish());
}

void MyClass::WaitForFunc1Finish()
{
int result = GetResponse();

emit Func1HasFinished();
}

如何使用 Boost 实现发射函数(在上面,这些是 MyClass 中的槽)和管道?

在此先感谢您的帮助

最佳答案

您可以使用 boost 来实现您的要求。但是,信号是不同的,因为 boost 不会为您提供事件循环来将信号分派(dispatch)给插槽。

这意味着连接到名为 in thread 的 boost 信号的插槽将在该线程中执行!

大致:

我的类.h

typedef boost::signals2::signal<void ()> FinishedSig;
typedef boost::shared_ptr<FinishedSig> FinishedSigPtr;

typedef boost::lock_guard<boost::mutex> LockGuard;

class MyClass
{
public:
// Signal
FinishedSig& finished() { return *m_sig; }
void Func1();
void WaitForFunc1Finish();
void WaitForFunc1FinishSlot();

private:
FinishedSigPtr m_sig;
boost::mutex m_mutex;
boost::thread m_thread;
}

我的类.cpp

// Signal connection
this->finished().connect(boost::bind(&MyClass::Func1HasFinishedSlot, this));


void MyClass::Func1()
{
//Do the stuff here
Func1Implementation()

m_thread = boost::thread(&MyClass::WaitForFunc1Finish, this);
}

void MyClass::WaitForFunc1Finish()
{
LockGuard l(m_mutex);
// Variables are guarded against concurrent access here
int result = GetResponse();

(*m_sig)(); // emit finished sig
}

void MyClass::Func1HasFinishedSlot()
{
// This will be executed in the calling thread
LockGuard l(m_mutex);
// Variables are guarded against concurrent access here
// do stuff
}

关于c++ - 将 Qt 信号转换为 boost 信号2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20562430/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com