簡體   English   中英

關閉QT GUI后如何停止線程

[英]How to stop a thread after we close the QT GUI

我正在qt中構建一個應用程序,其中我還使用boost在單獨的線程中創建了一個套接字服務器。

現在,當我關閉QT應用程序的GUI時,我也希望關閉線程。

但是目前我無法理解在關閉GUI時如何發出信號通知線程關閉。

int main(int argc, char *argv[])
{

    QApplication a(argc, argv);
    cont.SetName("RootItem");
    TreeModel* model = new TreeModel("RootElement", &cont);
    WavefrontRenderer w(model);
    w.show();    // Show the QT ui

    boost::asio::io_service io_service;
    server server1(io_service, 1980);
    boost::thread t(boost::bind(&io_service::run, &io_service));    

    return a.exec();
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


#include "ConHandler.h"
#include "WavefrontRenderer.h"
class Server
{
private:
    tcp::acceptor acceptor_;
    void start_accept()
    {
        // socket
        con_handler::pointer connection = con_handler::create(acceptor_.get_io_service());
        // asynchronous accept operation and wait for a new connection.
        acceptor_.async_accept(connection->socket(),
            boost::bind(&Server::handle_accept, this, connection,
                boost::asio::placeholders::error));
    }
public:

    //constructor for accepting connection from client
    Server(boost::asio::io_service& io_service  ) : acceptor_(io_service, tcp::endpoint(tcp::v4(), 1980))
    {
        start_accept();
    }
    void handle_accept(con_handler::pointer connection, const boost::system::error_code& err)
    {
        if (!err) {
            connection->start();
        }
        start_accept();
    }

};

///////////////////////////////////////////////////// ///////////////////////////////////////////////////// ////////////////////////////////////////////////////

停止線程是指在io_service實例上調用stop方法。 否則,將在未完成的線程上調用boost::thread析構函數,這將導致UB。

所有GUI事件均以exec方法處理。 如果關閉所有窗口,則此方法結束。 main端也是如此,並且在主作用域的末尾,所有局部變量都被銷毀。

因此,您可以只為lambda制作包裝器,該包裝器將在main的末尾調用,然后可以在其中調用stop方法。 然后線程dtor將正常工作。

template<class F>
struct Cleaner {
    Cleaner(F in) : f(in) {}
    ~Cleaner() { f(); }

    F f;
};

template<class F>
Cleaner<F> makeCleaner(F f) {
    return Cleaner<F>(f);
}

int main()

    boost::asio::io_service io_service;
    server server1(io_service, 1980);
    boost::thread t(boost::bind(&io_service::run, &io_service));   
    auto raii = makeCleaner( [&](){ io_service.stop(); } );
    return a.exec();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM