[Duilib]多线程更新界面的方法,自定义消息

来源:赵克立博客 分类: C/C++ 标签:C/C++duilib发布时间:2017-10-22 11:27:10最后更新:2017-10-22 16:13:31浏览:4026
版权声明:
本文为博主原创文章,转载请声明原文链接...谢谢。o_0。
更新时间:
2017-10-22 16:13:31
温馨提示:
学无止境,技术类文章有它的时效性,请留意文章更新时间,如发现内容有误请留言指出,防止别人"踩坑",我会及时更新文章

自定义消息

多线程更新界面一个永久的话题,duilib多线程更新首先想到的肯定是利用消息来更新界面这样才不会卡住ui线程,ui更新我们先自定义一个消息

//定义更新控件文本消息
#define WM_SETRICHEDITTEXT WM_USER + 50

定义并启动一个线程

定义好消息后,就是实现我们操作后启动一个线程然后在线程里进行我们的耗时操作,处理完成后把数据封装到消息参数中发送一个消息,然后等待ui线程捕获这个消息处理,创建线程前我们应该确定下要不要给线程传参数如果张需要的话我们要事先定义一个参数的结构体(定义一个结构体是为啦方便传入参数)如下

/*
*  线程函数中传入的结构体变量,
*/
struct ThreadPrama
{
	MainWnd* mwnd;
	/...........
};


然后就是定义一个线程的入口函数,入口函数必须是类的静态函数,并且格式是固定的,当然名字你可以随便起

//在类里面声明启动线程函数
static DWORD WINAPI ThreadProc(LPVOID lpParameter);

单击事件后传入参数并启动线程

//定义结构体参数
struct ThreadPrama *prama = new ThreadPrama;
prama->mwnd = this;
//定义并启动线程
DWORD dwThreadID = 0;
HANDLE hThread = CreateThread(NULL, 0, &MainWnd::ThreadProc, (LPVOID)prama, 0, &dwThreadID);

线程函数中接收参数并处理一些东西

DWORD MainWnd::ThreadProc(LPVOID lpParameter) {
    //转换参数为结构休
    struct ThreadPrama* parm=(struct ThreadPrama*)lpParameter;
    //网络请求操作
    parm->mwnd->m_richText = Http::SendRequest("http://www.baidu.com");
    //发送消息通知界面更新操作
    ::PostMessage(parm->mwnd->m_hWnd, WM_SETRICHEDITTEXT, 0L, 0L);
    //可以使用最后面的一个参数附加一些数据,
    //::PostMessage(prama->hWnd, WM_SETRICHEDITTEXT, 0L, (LPARAM)参数指针);
    return 0;
}

消息发送完就是等ui线程处理喽。重写HandleMessage这个消息处理方法

LRESULT MainWnd::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	LRESULT lRes = 0;
	BOOL bHandled = TRUE;
	switch (uMsg) {
	case WM_SETRICHEDITTEXT:   
		m_pRichPageCode->SetText(m_richText.c_str());
		break;
	default:
		bHandled = FALSE;
	}
	if (bHandled) return lRes;
	return __super::HandleMessage(uMsg, wParam, lParam);
}



微信号:kelicom QQ群:215861553 紧急求助须知
Win32/PHP/JS/Android/Python