MFC UI 线程






3.28/5 (21投票s)
2004年8月18日
2分钟阅读

91029

6749
一个简单的 UI 线程示例。
引言
本文描述了一个快速的 UI 线程实现。运行演示项目将创建两个模式对话框窗口。它们最初会彼此重叠。将顶部窗口移到一侧,以便您可以同时看到两个窗口。
每个对话框都在不同的线程中运行,并且每个对话框将维护一个单独的消息循环。可以通过单击每个线程的“锁定”按钮来看到这种行为。单击“锁定”后,线程将尝试获取对名为“ThreadLockExample
”的锁的访问权限。如果线程获得对锁的访问权限,将显示“Got Lock”消息。如果线程无法获取对锁的访问权限,则将显示“等待”消息。如果没有使用 UI 线程,则这两个对话框中看到的锁定行为将无法发生。为什么?有两个原因
- 如果两个对话框在一个线程中运行,那么等待锁会暂停两个线程。
- 你无法在工作线程中创建单独的对话框。 工作线程没有消息循环。
源代码
- Lock.h/cpp
管理单个锁,并从用户隐藏实现细节。
- UIThread.h/cpp
UI 线程的实现。
- ThreadExDlg.h/cpp
线程对话框。
- ThreadEx.h/cpp
线程示例主应用程序。
代码注释
创建线程
要创建用户界面线程,请创建一个从 CWinThread
派生的类的实例。然后,调用方法 CreateThread
。有关更多信息,请参阅 UIThread.h/cpp 和 ThreadEx.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;
};