예를 들어, Qt에서 GUI 스레드가 아닌 다른 스레드에서 신호를 내보내고 신호가 나중에 GUI 스레드에서 대기열에 포함되고 실행되면 거기에 부스트를 수행하는 방법이 있습니까?BOOST가 스레드에서 신호를 보내고 다른 슬롯에서 해당 슬롯을 실행하는 방법은 무엇입니까?
감사합니다.
예를 들어, Qt에서 GUI 스레드가 아닌 다른 스레드에서 신호를 내보내고 신호가 나중에 GUI 스레드에서 대기열에 포함되고 실행되면 거기에 부스트를 수행하는 방법이 있습니까?BOOST가 스레드에서 신호를 보내고 다른 슬롯에서 해당 슬롯을 실행하는 방법은 무엇입니까?
감사합니다.
이벤트 루프의 경우 boost :: asio :: io_service를 사용하십시오. 이 객체 내부에 작업을 게시하고 다른 스레드에서 스레드를 안전하게 실행할 수 있습니다.
struct MyClass
{
boost::io_service service;
void doSomethingOp() const { ... }
void doSomething()
{
service.post(boost::bind(&MyClass::doSomethingOp, this));
}
void loop()
{
service.run(); // processes the tasks
}
};
boost::signal<void()> mySignal;
MyClass myClass;
mySignal.connect(boost::bind(&MyClass::doSomething, boost::ref(myClass)));
// launches a thread and executes myClass.loop() there
boost::thread t(boost::bind(&MyClass::loop(), boost::ref(myClass)));
// calls myClass.doSomething() in this thread, but loop() executes it in the other
mySignal();
부스트가 이벤트 루프를 제공하지 않기 때문에 직접적으로 발생하지 않습니다.
신호를 다른 스레드에서 처리하게하려면 다른 스레드가 핸들러를 실행하고 실행해야하는 큐를 검사해야합니다 (일반적으로 일종의 이벤트 루프를 의미 함). Boost는 하나를 제공하지 않으므로 다른 곳에서 가져 오거나 작성해야합니다.
이벤트 루프가 신호를 제공하지 않는 경우 (또는 대기열을 사용하는 간단한 솔루션을 구현하는 경우) boost.signals2를 사용할 수 있어야합니다 (boost.signals가 아님). 스레드 안전) operator+=
을 재정 의하여 각 처리기를 다른 스레드로 래핑하여 다른 스레드에서 실행되도록 대기시킵니다. 반환 값 (Qt에서 지원되지 않지만 boost에 의해 지원되는)을 가진 시그널을 위해 시그널을 구현할 수도 있지만 데드 록을 피하기 위해서는 조심해야한다.
THX이 매우 유용한 샘플입니다. boost :: signal은 deprecated이므로 boost :: signals2 :: signal <>을 사용해야합니다. – synapse