// ============================================================================
//  qt_thread_worker —— 教学补充示例（非 wiki 生成，手工维护）
//  用途：方案书「C++方向 Day4」要求的 QThread 多线程编程（避免耗时任务阻塞主
//        线程/界面），仓库 p03/ 原有 wiki 抓取内容未覆盖这一点，故补一个最小示例。
//  说明：用 QCoreApplication 演示跨线程信号槽通信的核心模式（moveToThread +
//        排队连接），不需要 GUI；真实项目里把“耗时计算”换成真实业务逻辑、
//        把“打印结果”换成“更新界面控件”即可，模式不变。
//  配套文档：docs/teaching/examples/qthread_worker/README.md
// ============================================================================

#include <QCoreApplication>
#include <QThread>
#include <QObject>
#include <QDebug>

// Worker 不继承 QThread，而是被 moveToThread 挪到子线程执行——这是 Qt 官方推荐
// 的写法（继承 QThread 重写 run() 是早期常见但容易踩坑的旧写法）。
class Worker : public QObject {
    Q_OBJECT
public slots:
    void process() {
        // 模拟耗时计算（真实场景：大文件解析、网络请求、复杂运算……）
        // 注意用 qint64：1 加到 1000000 的和是 500000500000，超过 int 上限会溢出。
        qint64 sum = 0;
        for (int i = 1; i <= 1000000; ++i) sum += i;
        emit resultReady(sum);
    }
signals:
    void resultReady(qint64 result);
};

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

    QThread workerThread;
    Worker worker;
    worker.moveToThread(&workerThread);

    // 子线程启动后立即开始工作
    QObject::connect(&workerThread, &QThread::started, &worker, &Worker::process);
    // 工作完成 → 排队连接自动把回调调度回主线程 → 打印结果 → 结束线程与事件循环
    QObject::connect(&worker, &Worker::resultReady, &app, [&](qint64 result) {
        qDebug() << "子线程计算结果：" << result
                  << "（当前在" << (QThread::currentThread() == &workerThread ? "子线程" : "主线程") << "打印）";
        workerThread.quit();
    });
    QObject::connect(&workerThread, &QThread::finished, &app, &QCoreApplication::quit);

    workerThread.start();
    return app.exec();
}

#include "qt_thread_worker.moc"
