개체가 소멸 될 때 끝내려는 std::thread
을 포함하는 개체가 있습니다.QEventLoop을 std :: thread에 올바르게 임베드하는 방법은 무엇입니까?
최소한의 작업 코드 : 그것은 복잡 매우 빠르게된다
#include <thread>
#include <future>
#include <QEventLoop>
struct Connector
{
Connector(std::string addr, std::function<void(std::string)> cb)
{
std::promise<void> barrier;
auto fut = barrier.get_future();
m_worker = std::thread([addr, cb, &barrier]()
{
QEventLoop loop;
QTimer::singleShot(0, [this, &barrier, &loop]
{
m_quit = [&loop] { QTimer::singleShot(0, &loop, &QEventLoop::quit); };
barrier.set_value();
});
MySocket s(addr, cb);
loop.exec();
});
fut.wait();
}
~Connector()
{
m_quit();
m_worker.join();
}
std::thread worker;
std::function<void()> m_quit;
};
: 당신이이 exec()
입력 후에 만 loop
에 exit()
를 호출 할 수 있습니다, 당신은 스레드의 loop
외부를 만들 수 없습니다.
이 루프에서 실행을 위해 대기중인 처리기에서 해제 한 세마포어가있는 해결 방법 만 있습니다. 세마포어가 해제되면 필자는 루프가 생성되어 실행 중이라는 것을 확신 할 수 있으므로 필요한 경우 quit()
메시지로 종료 될 수 있습니다.
더 간단한 방법이 없습니까?
어떻게 '루프'로 무엇을합니까? 액세스 할 수 없으며 이벤트를 보낼 수 없습니다. – nwp
@nwp,'exec()'의 직전에 객체를 생성합니다. 소켓과 같은 것, 연결할 IP 주소와 데이터를위한'std :: function' 콜백을 전달합니다. – Velkan
소켓을 통해 이벤트 루프와 통신하는 방식이 표시되지 않습니다. 여러분이 ['QThread'] (http://doc.qt.io/qt-5/qthread.html)를 다시 구현하는 것처럼 보입니다. 이미 이벤트 루프 및 신호/슬롯 지원이 제공됩니다. – nwp