以下是一个使用MFC编写的多线程案例,其中包含一个主线程和两个工作线程。

#include "stdafx.h"
#include "MyThread.h"
#include "MultiThreadDemoDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

// CMultiThreadDemoApp

BEGIN_MESSAGE_MAP(CMultiThreadDemoApp, CWinApp)
    ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
END_MESSAGE_MAP()

// CMultiThreadDemoApp 构造

CMultiThreadDemoApp::CMultiThreadDemoApp()
{
    // 支持重新启动管理器
    m_dwRestartManagerSupportFlags = AFX_RESTART_MANAGER_SUPPORT_RESTART;

    // TODO: 在此处添加构造代码,
    // 将所有重要的初始化放置在 InitInstance 中
}

// 唯一的一个 CMultiThreadDemoApp 对象

CMultiThreadDemoApp theApp;

// CMultiThreadDemoApp 初始化

BOOL CMultiThreadDemoApp::InitInstance()
{
    // InitCommonControlsEx() 是必须的,否则可能在使用 ShellResource 时出错
    INITCOMMONCONTROLSEX InitCtrls;
    InitCtrls.dwSize = sizeof(InitCtrls);
    // 将它设置为包括所有要在应用程序中使用的通用控件类。
    InitCtrls.dwICC = ICC_WIN95_CLASSES;
    InitCommonControlsEx(&InitCtrls);

    CWinApp::InitInstance();

    AfxEnableControlContainer();

    // 创建主对话框对象
    CMultiThreadDemoDlg dlg;
    m_pMainWnd = &dlg;
    INT_PTR nResponse = dlg.DoModal();
    if (nResponse == IDOK)
    {
        // TODO: 在此处放置处理何时用“确定”来关闭
        //  对话框的代码
    }
    else if (nResponse == IDCANCEL)
    {
        // TODO: 在此处放置处理何时用“取消”来关闭
        //  对话框的代码
    }

    // 由于对话框已被关闭,所以将返回 FALSE 以便退出应用程序,
    //  而不是启动应用程序的消息泵。
    return FALSE;
}
// MyThread.h
#pragma once
#include <afxwin.h>

class CMyThread : public CWinThread
{
    DECLARE_DYNCREATE(CMyThread)

protected:
    CMyThread();           // 动态创建所使用的受保护的构造函数
    virtual ~CMyThread();

public:
    virtual BOOL InitInstance();    // 初始化线程
    virtual int ExitInstance();     // 结束线程

protected:
    DECLARE_MESSAGE_MAP()
};

// MyThread.cpp
#include "stdafx.h"
#include "MyThread.h"

IMPLEMENT_DYNCREATE(CMyThread, CWinThread)

CMyThread::CMyThread()
{
}

CMyThread::~CMyThread()
{
}

BOOL CMyThread::InitInstance()
{
    // TODO: 执行任意的初始化
    return TRUE;
}

int CMyThread::ExitInstance()
{
    // TODO: 执行任意的清理
    return CWinThread::ExitInstance();
}

BEGIN_MESSAGE_MAP(CMyThread, CWinThread)
END_MESSAGE_MAP()
// MultiThreadDemoDlg.h
#pragma once
#include "MyThread.h"

class CMultiThreadDemoDlg : public CDialogEx
{
public:
    CMultiThreadDemoDlg(CWnd* pParent = nullptr);   // 标准构造函数
    virtual ~CMultiThreadDemoDlg();

#ifdef AFX_DESIGN_TIME
    enum { IDD = IDD_MULTITHREADDEMO_DIALOG };
#endif

protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

    DECLARE_MESSAGE_MAP()

    CMyThread* m_pThread1;
    CMyThread* m_pThread2;
    static UINT ThreadProc(LPVOID pParam);

public:
    afx_msg void OnBnClickedStart();
    afx_msg void OnBnClickedStop();

    CListBox m_listOutput;
    CButton m_btnStart;
    CButton m_btnStop;
};

// MultiThreadDemoDlg.cpp
#include "stdafx.h"
#include "MultiThreadDemo.h"
#include "MultiThreadDemoDlg.h"
#include "afxdialogex.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

CMultiThreadDemoDlg::CMultiThreadDemoDlg(CWnd* pParent /*=nullptr*/)
    : CDialogEx(IDD_MULTITHREADDEMO_DIALOG, pParent)
{
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

CMultiThreadDemoDlg::~CMultiThreadDemoDlg()
{
}

void CMultiThreadDemoDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
    DDX_Control(pDX, IDC_LIST_OUTPUT, m_listOutput);
    DDX_Control(pDX, IDC_BUTTON_START, m_btnStart);
    DDX_Control(pDX, IDC_BUTTON_STOP, m_btnStop);
}

BEGIN_MESSAGE_MAP(CMultiThreadDemoDlg, CDialogEx)
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    ON_BN_CLICKED(IDC_BUTTON_START, &CMultiThreadDemoDlg::OnBnClickedStart)
    ON_BN_CLICKED(IDC_BUTTON_STOP, &CMultiThreadDemoDlg::OnBnClickedStop)
END_MESSAGE_MAP()

// CMultiThreadDemoDlg 消息处理程序

BOOL CMultiThreadDemoDlg::OnInitDialog()
{
    CDialogEx::OnInitDialog();

    // 将“关于...”菜单项添加到系统菜单中。

    // IDM_ABOUTBOX 必须在系统命令范围内。
    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    ASSERT(IDM_ABOUTBOX < 0xF000);

    CMenu* pSysMenu = GetSystemMenu(FALSE);
    if (pSysMenu != nullptr)
    {
        CString strAboutMenu;
        strAboutMenu.LoadString(IDS_ABOUTBOX);
        if (!strAboutMenu.IsEmpty())
        {
            pSysMenu->AppendMenu(MF_SEPARATOR);
            pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
        }
    }

    // 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
    //  执行此操作
    SetIcon(m_hIcon, TRUE);			// 设置大图标
    SetIcon(m_hIcon, FALSE);		// 设置小图标

    // TODO: 在此添加额外的初始化代码

    m_btnStart.EnableWindow(TRUE);
    m_btnStop.EnableWindow(FALSE);

    return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

void CMultiThreadDemoDlg::OnPaint()
{
    if (IsIconic())
    {
        CPaintDC dc(this); // 用于绘制的设备上下文

        SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

        // 使图标在工作矩形中居中
        int cxIcon = GetSystemMetrics(SM_CXICON);
        int cyIcon = GetSystemMetrics(SM_CYICON);
        CRect rect;
        GetClientRect(&rect);
        int x = (rect.Width() - cxIcon + 1) / 2;
        int y = (rect.Height() - cyIcon + 1) / 2;

        // 绘制图标
        dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
        CDialogEx::OnPaint();
    }
}

HCURSOR CMultiThreadDemoDlg::OnQueryDragIcon()
{
    return static_cast<HCURSOR>(m_hIcon);
}

void CMultiThreadDemoDlg::OnBnClickedStart()
{
    m_pThread1 = (CMyThread*)AfxBeginThread(RUNTIME_CLASS(CMyThread), THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);
    m_pThread1->ResumeThread();

    m_pThread2 = (CMyThread*)AfxBeginThread(RUNTIME_CLASS(CMyThread), THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);
    m_pThread2->ResumeThread();

    m_btnStart.EnableWindow(FALSE);
    m_btnStop.EnableWindow(TRUE);
}

void CMultiThreadDemoDlg::OnBnClickedStop()
{
    m_pThread1->SuspendThread();
    m_pThread2->SuspendThread();

    m_btnStart.EnableWindow(TRUE);
    m_btnStop.EnableWindow(FALSE);
}

UINT CMultiThreadDemoDlg::ThreadProc(LPVOID pParam)
{
    CMultiThreadDemoDlg* pDlg = (CMultiThreadDemoDlg*)pParam;
    CString strThreadId;
    strThreadId.Format(_T("%d"), GetCurrentThreadId());

    while (1)
    {
        CString strOutput;
        strOutput.Format(_T("Thread ID: %s"), strThreadId);
        pDlg->m_listOutput.AddString(strOutput);

        Sleep(1000);
    }

    return 0;
}

在这个案例中,我们创建了一个具有两个工作线程的MFC对话框应用程序。单击"Start"按钮将启动两个工作线程,它们将分别输出自己的线程ID到列表框中。单击"Stop"按钮将暂停这两个工作线程。

请注意,我们使用CMyThread类继承自CWinThread来创建工作线程,重写了InitInstanceExitInstance函数,以便在工作线程的初始化和结束时执行相关操作。工作线程的具体逻辑在ThreadProc函数中实现,它通过调用主对话框类的成员函数来更新UI界面。

这只是一个简单的多线程案例,你可以根据需求进行扩展和修改

用mfc写一个多线程的案例

原文地址: http://www.cveoy.top/t/topic/iU4b 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录