KWinUI sample:工作线程(work thread)中的UI窗口

在一个多线程应用程序中,进程创建的第一个线程我们称之为主线程(main thread),而从主线程中通过系统调用派生的其他线程称之为工作线程(work thread)。虽然习惯上这么称呼,而在实际上这两种线程并没有本质的差别,他们的能力是完全一样的,唯一的区别就在于派生的先后顺序而已。

下面来演示一下KWinUI中如何使工作线程拥有窗口,代码如下:
1 #include “kwin.h”
2 #include “kctrls.h”
3 #include “kapp.h”
4
5 using namespace kwinui;
6
7 class KMainWindow : public KWindowBase{
8 public:
9     KMainWindow():KWindowBase(_T(“MyClassName”)){}
10     BEGIN_MSG_MAP
11         MSG_HANDLER(WM_CREATE,OnCreate)
12         COMMAND_ID_HANDLER(1000,OnExit)
13     END_MSG_MAP(KWindowBase)
14
15     LRESULT OnCreate(UINT uMsg,WPARAM wParam,LPARAM lParam,bool& bHandled){
16         RECT rect1={30,30,90,60};
17         m_btnExit.Create(this**,_T(“exit”),WS_CHILDWS_VISIBLEWS_TABSTOP,rect1,1000);
18         return 0;
19     }
20     LRESULT OnExit(WORD wID,WORD wNotifyCode,HWND hWndCtrl,bool& bHandled){
21         m_nRetCode=wID;
22         SendMessage(WM_CLOSE);
23         return 0;
24     }
25 private:
26     int     m_nRetCode;
27     KButton m_btnExit;
28 };
29
30 class KWorkThread : public KThreadImpl{
31 public:
32     KWorkThread():KThreadImpl(CREATE_SUSPENDED){}
33     bool InitInstance(){
34         m_pMainWindow=new KMainWindow();
35         m_pMainWindow->CreateOverlappedWindow(_T(“work thread’s main window”));
36         return true;
37     }
38     void ExitInstance(){
39         SAFE_DEL_PTR(m_pMainWindow);
40     }
41 public:
42     KMainWindow
m_pMainWindow;
43 };
44
45 **class
 KThreadUIApp : public KWinApp{
46 public:
47     KThreadUIApp():m_pMainWindow(0),m_pWorkThread(0){}
48     bool InitInstance(){
49         m_pWorkThread=new KWorkThread();
50         m_pWorkThread->ResumeThread();
51
52         m_pMainWindow=new KMainWindow();
53         m_pMainWindow->CreateOverlappedWindow(_T(“main thread’s main window”));
54
55         return true;
56     }
57     void ExitInstance(){
58         SAFE_DEL_PTR(m_pMainWindow);
59         SAFE_DEL_PTR(m_pWorkThread);
60     }
61     
62 private:
63     KMainWindow*    m_pMainWindow;
64     KWorkThread*    m_pWorkThread;
65 };
66
67 KThreadUIApp theApp;

我们可以很清楚的看到,工作线程拥有UI窗口的方式与主线程是完全一样的,不过主线程多了一项简单的工作,创建工作线程而已。

我们甚至可以让主线程提前结束,而由工作线程继续显示窗口来与用户交互,这就更可以证明这两种线程是完全一样的。

用Visual C++ 2008 Express win32 project默认设置静态链接Release版本生成的程序大小为57KB。
截图:threadui
代码下载

预告:近期会推出KWinUI换肤框架的Demo,敬请期待…