65.9K
CodeProject 正在变化。 阅读更多。
Home

MFC UI 线程

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.28/5 (21投票s)

2004年8月18日

2分钟阅读

viewsIcon

91029

downloadIcon

6749

一个简单的 UI 线程示例。

Image of demo application

引言

本文描述了一个快速的 UI 线程实现。运行演示项目将创建两个模式对话框窗口。它们最初会彼此重叠。将顶部窗口移到一侧,以便您可以同时看到两个窗口。

每个对话框都在不同的线程中运行,并且每个对话框将维护一个单独的消息循环。可以通过单击每个线程的“锁定”按钮来看到这种行为。单击“锁定”后,线程将尝试获取对名为“ThreadLockExample”的锁的访问权限。如果线程获得对锁的访问权限,将显示“Got Lock”消息。如果线程无法获取对锁的访问权限,则将显示“等待”消息。如果没有使用 UI 线程,则这两个对话框中看到的锁定行为将无法发生。为什么?有两个原因

  1. 如果两个对话框在一个线程中运行,那么等待锁会暂停两个线程。
  2. 你无法在工作线程中创建单独的对话框。 工作线程没有消息循环。

源代码

  • Lock.h/cpp

    管理单个锁,并从用户隐藏实现细节。

  • UIThread.h/cpp

    UI 线程的实现。

  • ThreadExDlg.h/cpp

    线程对话框。

  • ThreadEx.h/cpp

    线程示例主应用程序。

代码注释

创建线程

要创建用户界面线程,请创建一个从 CWinThread 派生的类的实例。然后,调用方法 CreateThread。有关更多信息,请参阅 UIThread.h/cppThreadEx.cpp

class UIThread : public CWinThread
    ...
};
...
BOOL CThreadexApp::InitInstance()
{
    ...
    // Create a thread to generate a maintain a instance of CThreadexDlg.
    thread.CreateThread();
    ...
}

创建互斥体(锁)

要创建锁,只需调用 CreateMutex(...)。请参阅 Lock.h/cpp

CDMLock::CDMLock(const CString & name)
{
    mutex = CreateMutex(NULL, 0, name);
}

获取锁(下)

调用 WaitForSingleObject(...)。您可以选择传递一个超时值。当您等待的时间超过指定时间时,函数 WaitForSingleObject 将返回 WAIT_TIMEOUT。如果锁获取成功,它将返回 WAIT_OBJECT_0

// Get lock. If timeout expires than return fail.
bool CDMLock::Lock(DWORD timeout)
{
    if (mutex) {
        if (WaitForSingleObject(mutex, timeout) == WAIT_OBJECT_0) 
            return true;
    }
    return false;
}

释放锁(上)

// Release lock.
bool CDMLock::Unlock()
{
    if (mutex) {
        if (ReleaseMutex(mutex))
            return true;
    }
    return false;
}

CDMLock (可重用)

本文下载中包含的大部分代码都是演示代码。但是,CDMLock 类(lock.h/cpp)是一个不错的类。虽然使用锁确实不是那么困难,但能够隐藏细节总是好的。CDMLock 很容易使用。只需将一个字符串传递给构造函数即可创建命名锁。然后调用 Lock 以获取对锁的访问权限。调用 Unlock 以释放锁。有关使用 CDMLock 的示例,请查看 ThreadExDlg.cpp

CDMLock 类也可以用于在同一台计算机上运行的两个进程,而不仅仅是同一进程中的两个线程。

class CDMLock  
{
public:
    CDMLock(const CString & name);
    virtual ~CDMLock();
    bool Unlock();
    bool Lock(DWORD timeout = INFINITE);
   
private:
    HANDLE mutex;
};
© . All rights reserved.