首页 > 解决方案 > 通过 Qt 中的线程调用 Rust 库

问题描述

我正在为 Rust 库制作一个 Qt 前端,它公开了一个 C++ 函数,该函数阻止了它所在的执行线程,但允许传递一个回调函数以在两端之间进行通信。

所以我想到了使用 Qt 的线程技术让库在另一个线程上执行,并且我希望对 Rust 库进行尽可能少的修改

这是我使用 QThreads 的方法:

后端.cpp:

typedef void(*callback_t)(void *,const char *);
extern "C" call_rust_library(const char *config, void *cb_data, callback_t cb);

template<typename T>
void call_wrapper(void *ptr, const char*data) {
    (*static_cast<T*>(ptr))(data);
}

class BackEnd : public QObject {
    Q_OBJECT
public slots:
    void do_computations(ConfigObject *config) {
        //...parse configuration from the frontend...
        char* parsed_configuration;
        BackEnd* backend = this;

        auto callback = [backend](char* data) {
            //...process obtained data from the library...
            QString type,contents;
            backend->emit send_message(type,contents);
        }

        call_rust_library(parsed_configuration,(void *)&callback,call_wrapper<decltype(callback)>);
    }
signals:
    void send_message(QString type, QString contents);
}

前端.cpp:

class FrontEnd : public QMainWindow {
    Q_OBJECT
    QThread thread;
    ConfigObject *config;
public slots:
    void process_message(QString type, QString contents) {
        //...do GUI things with the message
    }
private slots:
    void on_request_start_thread() {
        // called by a GUI event
        BackEnd* backend = new BackEnd;
        backend->moveToThread(&thread);
        connect(&thread,&QThread::finished,backend,&QObject::deleteLater);
        connect(this,&FrontEnd::run_thread,backend,&BackEnd::do_computations);
        connect(backend,&BackEnd::send_message,frontend,&FrontEnd::process_message);
        emit run_thread(config)
    }
signals:
    void run_thread(ConfigObject *config);
}

但是我有几个问题:

最近我发现这个示例存储库允许将 Qt 与 Rust 库绑定,但似乎没有深入研究多线程,并且可能需要将我的项目从 CMake 移植到 qmake。但据我了解,Rust 执行应该驻留在另一个线程中,所以我不确定它是如何在这里实现的。

标签: c++multithreadingqtrust

解决方案


实现是正确的,除了我在函数thread->start()结束时忘记了调用。on_request_thread()

崩溃是因为解析ConfigObject时出现问题,所以和线程的制作无关。


推荐阅读