lengshizai 2024-03-05 10:20 采纳率: 31.7%
浏览 17
已结题

C++/qt 线程问题

请协助判断 我的主线程是哪一个 并就讲解,我认为是inject那个线程,另外,如果将inject线程中的函数放入dllmian()中,主线程变更为什那一条线程?
另:请另给出一个qt多线程模板
或者mfc的多线程模板,下一步学习目标是多开程序,各自处理自己的任务。

img

img

img

  • 写回答

22条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-03-05 10:20
    关注
    获得0.45元问题酬金

    引自免费微信小程序:皆我百晓生

    在您的代码片段中,主线程是创建QCoreApplication a(arge, nullptr);的线程。在Qt应用程序中,主线程通常是执行main()函数的那个线程,其中初始化了QApplicationQCoreApplication实例并调用其exec()方法以启动事件循环。

    对于您提到的InjectD11(LPVOID IParam)函数,当它在一个新创建的线程(如图2中的第50-51行)中运行时,那么这个线程就不是主线程。如果您将该函数的内容移动到DLLMainDLL_PROCESS_ATTACH分支内,并且不创建额外的线程来执行它,那么这部分逻辑将在加载DLL时由进程的主线程执行。

    关于Qt多线程模板,请参考以下示例:

    #include <QThread>
    #include <QDebug>
    
    // 工作类,继承自QObject并在工作线程中运行
    class Worker : public QObject
    {
        Q_OBJECT
    public:
        Worker(QObject *parent = nullptr) : QObject(parent) {}
    
    public slots:
        void doWork()
        {
            for (int i = 0; i < 100; ++i) {
                qDebug() << "Worker thread: " << QThread::currentThreadId();
                // 在这里执行耗时任务
                QThread::sleep(1);
            }
        }
    };
    
    int main(int argc, char *argv[])
    {
        QCoreApplication app(argc, argv);
    
        // 创建工作线程
        QThread workerThread;
        Worker worker;
    
        // 将worker对象移动到workerThread线程中
        worker.moveToThread(&workerThread);
    
        // 连接线程开始信号到doWork槽
        QObject::connect(&workerThread, &QThread::started, &worker, &Worker::doWork);
    
        // 连接线程完成信号到quit槽,以便在工作完成后退出线程
        QObject::connect(&worker, &Worker::finished, &workerThread, &QThread::quit);
    
        // 启动工作线程
        workerThread.start();
    
        // 主线程继续执行,直到所有事件处理完毕
        return app.exec();
    }
    

    对于MFC多线程模板,可以使用afxbeginthread或者CWinThread类实现,如下所示:

    class CMyWorkerThread : public CWinThread
    {
    protected:
        virtual BOOL InitInstance() override
        {
            // 初始化线程数据和状态
            return TRUE;
        }
    
        virtual int Run() override
        {
            // 在这里执行线程的任务
            for (int i = 0; i < 100; ++i)
            {
                AfxMessageBox(_T("Working in MFC thread..."));
                // 模拟耗时任务
                Sleep(1000);
            }
            return 0;
        }
    };
    
    // 在主函数中创建并启动线程
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    {
        // ...
        CMyWorkerThread workerThread;
        if (workerThread.CreateThread() != 0)
        {
            workerThread.ResumeThread(); // 如果需要立即开始执行,则唤醒线程
        }
        // 继续执行主窗口和其他程序逻辑...
        // ...
    }
    

    请注意,在实际编程中,务必确保正确同步线程间的访问,并遵循线程安全原则。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 3月13日
  • 创建了问题 3月5日

悬赏问题

  • ¥15 软件工程用例图的建立(相关搜索:软件工程用例图|画图)
  • ¥15 如何在arcgis中导出拓扑关系表
  • ¥15 处理数据集文本挖掘代码
  • ¥15 matlab2017
  • ¥15 在vxWorks下TCP/IP编程,总是connect()报错,连接服务器失败: errno = 0x41
  • ¥15 AnolisOs7.9如何安装 Qt_5.14.2的运行库
  • ¥20 求:怎么实现qt与pcie通信
  • ¥50 前后端数据顺序不一致问题,如何解决?(相关搜索:数据结构)
  • ¥15 基于蒙特卡罗法的中介效应点估计代码
  • ¥15 罗技G293和UE5.3