No.3:非模式对话框与多线程应用

来源:互联网 发布:电脑安装mac os x 编辑:程序博客网 时间:2024/06/06 01:04

    主对话框中创建了另一个非模式对话框后,希望两者的运行互不干扰,即在新的非模式对话框弹出后运行一些调度,但不影响对原来主窗口进行别的操作。

    原来的做法是在主对话框对应的按钮(创建新的非模式对话框)消息映射里,直接写对新的非模式对话框的操作。但这样一来主对话框就卡得不能动了。

    解决的办法就是开辟一个新线程。

    三步操作

    【线程使用】

    (1)在主对话框类里增加一个静态成员函数(线程函数)

     static DWORD  WINAPI  ***Thread(LPVOID  lparam);//注意要声明为static

    (2)创建线程

     pMag....相关参数

     HANDLE hThread = CreateThread(NULL,0,***Thread,(LPVOID)pMsg,0,0);//启动线程

     CloseHandle(hThread);

    (3)具体实现线程函数

     DWORD  WINAPI CTestDlg::***Thread(LPVOID  lparam)
    {

     ...

    }

 

 

     个人喜欢用pMsg来传递参数。建立一个结构体

     typedef struct _MSG_INFO

     {

           int    a;

           bool b;//....

     }MSG_INFO

     然后在创建线程之前把相关参数放在该结构体指针变量中

     MSG_INFO *pMsg = new MSG_IFNO;

     pMsg->a = ...;

     pMsg->b = ...;

     然后在线程实现函数里可以取出对应的参数。

    int aa = ((MSG_INFO*)lparam)->a;

    int bb = ((MSG_INFO*)lparam)->b;

    delete lparam;

    当然线程实现函数里还可以向对应的窗口发送消息。

    【用户自定义消息处理过程】

   ::PostMessage(hwnd,WM_SENDMSG,0,(LPARAM)pMsg);

   //此处hwnd是响应该消息的窗口句柄,所以得事先指定好。比如在中兴的竞赛中,要向原来的主对话框回传消息,则事先把原来主对话框的句柄保存起来。即在对话框创建新对话框之前,取出系统变量m_hWnd(HWND CWND::m_hWnd),每个窗口都有一个,则样当要执行这个自定义消息时,就能找到对应窗口来响应这个消息了

    WM_SENDMSG是自定义的消息宏。在*.h里加上 #define WM_SENDMSG WM_USER + 100;//

    然后在*.cpp文件的

    BEGIN_MESSAGE_MAP(C*Dlg, CDialog)

    //此处添加上ON_MESSAGE(WM_SENDMSG,OnSendMsg)//OnSendMsg是对应的消息映射函数

    END_MESSAGE_MAP()

 

    附:关于线程

   当一个进程建立起来后(程序拿到内存里去执行)就会产生一个主线程,所以每个windows程序一开始就有了一个线程,调用CreateThread相当于是生成子线程。(当然在子线程的实现体力还可以创建线程)

    CreateThread(NULL,0,myThreadProc,pMsg,0,&Tid)函数参数

    有6个参数

    参数1:安全属性设定以及继承,通常直接写为NULL,

    参数2:设定堆栈大小,通常写为0,

    参数3:设定线程函数名称

    参数4:给该函数传递的参数,可以在线程具体实现里用lparam取出

    参数5:如果写为0表示线程立刻开始执行,如果是CREATE_SUSPENDED,则要求线程暂停执行,必须调用哪个ResumeThread才能让其再执行

    参数6:可不写,DWORD的指针,存放线程ID.

   【经验之谈】

    对于需要前台界面显示,又需要后台接受处理一些数据的问题多要创建个子线程来单独处理数据。因为前台显示是一个主线程干的事,如果你又让他去处理一些数据的问题,那就可能不会及时显示,甚至卡在那了。

   当初做中兴的竞赛时,前台负责显示,后端要和远端设备进行socket通信,当有数据来时再显示在主界面窗口上。所以必须开辟一个“后来线程”来处理。

  

原创粉丝点击