惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
云风的 BLOG
云风的 BLOG
美团技术团队
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
爱范儿
爱范儿
Stack Overflow Blog
Stack Overflow Blog
WordPress大学
WordPress大学
GbyAI
GbyAI
雷峰网
雷峰网
P
Proofpoint News Feed
IT之家
IT之家
人人都是产品经理
人人都是产品经理
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
aimingoo的专栏
aimingoo的专栏
小众软件
小众软件
T
The Blog of Author Tim Ferriss
月光博客
月光博客
V
Visual Studio Blog
L
LINUX DO - 热门话题
L
Lohrmann on Cybersecurity
T
Troy Hunt's Blog
Project Zero
Project Zero
U
Unit 42
T
Tor Project blog
Scott Helme
Scott Helme
L
LINUX DO - 最新话题
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
I
InfoQ
Cloudbric
Cloudbric
P
Proofpoint News Feed
The Cloudflare Blog
H
Heimdal Security Blog
Google DeepMind News
Google DeepMind News
The GitHub Blog
The GitHub Blog
Attack and Defense Labs
Attack and Defense Labs
有赞技术团队
有赞技术团队
T
Threat Research - Cisco Blogs
T
The Exploit Database - CXSecurity.com
J
Java Code Geeks
博客园 - 【当耐特】
Security Latest
Security Latest
The Register - Security
The Register - Security
F
Fortinet All Blogs
I
Intezer
H
Hackread – Cybersecurity News, Data Breaches, AI and More
MongoDB | Blog
MongoDB | Blog
N
Netflix TechBlog - Medium
NISL@THU
NISL@THU
T
Tenable Blog

博客园 - zzuCharles

Qwen-Max 8G 内存本地部署方案(轻量化可用版) 高性能 Flink SQL 优化 Flink 时间概念 EventTime 和 Watermark SQL 优化(来源平时总结及网络分享) hadoop 查询优化 python 读取csv多编码兼容读取 文件拆分-python Mysql 调优笔记 Python 输出菱形 Python 读取目录,office文件分类 Python 猜数小程序(练习) Mysql 字符串日期互转 MaxCompute 语句笔记 数据仓库架构 Python 比较两个字符串的相似度 Python print Python简单计算器 用户价值模型 CITE :https://www.jianshu.com/p/34199b13ffbc 用户生命周期模型
MFC中使用多线程
zzuCharles · 2023-06-29 · via 博客园 - zzuCharles

一、在MFC中使用多线程,可以通过CWinThread类来实现。下面是一个简单的示例,演示了如何在MFC应用程序中创建和使用多线程:

  1. 在你的MFC应用程序中包含头文件 "afxmt.h",该头文件包含了多线程相关的类和函数。

  2. 创建一个派生自CWinThread的自定义线程类。示例代码如下:

class MyThread : public CWinThread
{
public:
    virtual BOOL InitInstance();
    virtual int ExitInstance();
    afx_msg void MyWorkerFunction();
    DECLARE_MESSAGE_MAP()
};

BEGIN_MESSAGE_MAP(MyThread, CWinThread)
    ON_THREAD_MESSAGE(WM_USER, MyWorkerFunction)
END_MESSAGE_MAP()

BOOL MyThread::InitInstance()
{
    AfxMessageBox(_T("Thread started!"));
    return TRUE;
}

int MyThread::ExitInstance()
{
    AfxMessageBox(_T("Thread stopped!"));
    return CWinThread::ExitInstance();
}

void MyThread::MyWorkerFunction()
{
    // 该函数会在子线程中执行
    // 这里可以编写你的具体业务逻辑
    AfxMessageBox(_T("Worker function executing!"));
}

在自定义线程类中,你可以重写InitInstance函数和ExitInstance函数,用于初始化和清理线程。另外,你也可以定义自己的工作函数(如MyWorkerFunction),该函数将在子线程中执行具体的业务逻辑。

  1. 在主线程中创建并启动自定义线程。示例代码如下:
// 创建自定义线程对象
MyThread* pThread = (MyThread*)AfxBeginThread(RUNTIME_CLASS(MyThread));

// 启动线程
pThread->ResumeThread();

在主线程中,你可以使用AfxBeginThread函数创建自定义线程对象,并指定线程类类型。然后,通过调用ResumeThread函数启动线程的执行。

以上是一个简单的多线程示例,在实际开发中,你需要根据具体需求进行适当的调整。例如,你可以使用同步对象(如互斥量或信号量)进行线程间通信和同步,以防止竞争条件和数据不一致等问题。

需要注意的是,MFC的多线程机制是基于Windows的多线程机制实现的,因此,在使用MFC多线程时,也需要遵循Windows多线程的一些规则和注意事项。

二、以下是MFC子线程业务入参设置实例,仅供参考:
在 MFC 中,可以通过重写 CWinThread 的派生类的 InitInstance 函数将业务参数传递给子线程。下面是一个示例:

class CMyThread : public CWinThread
{
public:
    CMyThread()
    {
        // 初始化业务参数
        m_nParam = 0;
    }

    virtual BOOL InitInstance()
    {
        // 在这里进行业务处理,可以使用 m_nParam 来访问传入的参数
        // ...

        // 返回 TRUE 表示初始化成功
        return TRUE;
    }

    void SetParam(int nParam)
    {
        m_nParam = nParam;
    }

private:
    int m_nParam;
};

在主线程中,可以创建 CMyThread 的实例并设置业务参数,然后通过 CreateThreadAfxBeginThread 函数启动子线程:

// 创建子线程并开启
CMyThread* pThread = new CMyThread();
pThread->SetParam(123); // 设置业务参数
pThread->CreateThread();

// 或者使用 AfxBeginThread 启动子线程
CMyThread* pThread = new CMyThread();
pThread->SetParam(123); // 设置业务参数
AfxBeginThread(RUNTIME_CLASS(CMyThread), THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED, NULL);
pThread->ResumeThread();

上述示例中,CMyThread 类继承自 CWinThread,在 InitInstance 函数中可以访问传入的业务参数 m_nParam。在主线程中,创建 CMyThread 的实例后,可以使用 SetParam 函数设置业务参数的值,然后通过 CreateThreadAfxBeginThread 函数启动子线程。子线程启动后,会调用 InitInstance 函数进行业务处理。