当前位置: 首页 > wzjs >正文

淳安千岛湖建设集团网站百度指数关键词未收录怎么办

淳安千岛湖建设集团网站,百度指数关键词未收录怎么办,电脑软件界面设计,深圳团购网站建设前言 做Windows界面开发时,经常需要在多线程环境中将操作抛到主线程执行,通常做法是定义一个WM_USER消息,将函数指针通过SendMessage发送给窗口,窗口过程中接收消息后执行函数。本文提供的方法可以在任意地方使用,不需…

前言

做Windows界面开发时,经常需要在多线程环境中将操作抛到主线程执行,通常做法是定义一个WM_USER消息,将函数指针通过SendMessage发送给窗口,窗口过程中接收消息后执行函数。本文提供的方法可以在任意地方使用,不需要重新定义消息以及接收消息。


一、基本实现

只是基本的实现方法,也包含了基本原理。

1、自定义WM消息

#define  WM_INVOKE WM_USER+3328

2、发送消息

需要UI线程执行的函数

 void action(void* arg){//ui线程执行的操作}

发送到ui线程

SendMessage(hwnd, WM_INVOKE, action, arg);

3、窗口过程中执行函数

static LRESULT  wnd_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparma)
{switch (msg) {case WM_INVOKE:{	void(*action)(void* s);action = wparam;action(lparma);}break;}return 0;
}

二、优化实现

上述实现,需要在每个窗口或每个项目的窗口过程写代码,移植起来很麻烦。我们通过钩子的方式做成,实现一次到处使用
定义消息略,与基本实现一致。

1、钩子过程中执行函数

定义一个钩子过程,并在钩子过程中执行函数。

LRESULT CALLBACK hook_proc(int code, WPARAM wParam, LPARAM lParam) {CWPSTRUCT* msg = lParam;if (msg->message == WM_INVOKE) { ((void(*)(void* s)) msg->wParam)(msg->lParam);}return 0;
}

2、设置钩子

HHOOK hook = SetWindowsHookEx(WH_CALLWNDPROC, hook_proc, GetModuleHandle(NULL), GetWindowThreadProcessId(hwnd, NULL));

3、发送消息

将函数通过消息发送出去

SendMessage(hwnd, WM_INVOKE, action, arg);

4、卸载钩子

UnhookWindowsHookEx(hook);

三、完整代码

1、C

#include<Windows.h>
#define  WM_INVOKE WM_USER+3328
static LRESULT CALLBACK hook_proc(int code, WPARAM wParam, LPARAM lParam) {CWPSTRUCT* msg = lParam;if (msg->message == WM_INVOKE) { ((void(*)(void* s)) msg->wParam)(msg->lParam);}return 0;
}
/// <summary>
/// 将操作切换到窗口线程执行,同步。
/// </summary>
/// <param name="hwnd">窗口句柄</param>
/// <param name="action">执行的操作</param>
/// <param name="arg">透传参数</param>
void invoke(HWND hwnd, void(*action)(void* arg), void* arg) {if (GetCurrentThreadId() != GetWindowThreadProcessId(hwnd, NULL)) {HHOOK hook = SetWindowsHookEx(WH_CALLWNDPROC, hook_proc, GetModuleHandle(NULL), GetWindowThreadProcessId(hwnd, NULL));SendMessage(hwnd, WM_INVOKE, action, arg);UnhookWindowsHookEx(hook);}else action(arg);
}

1、C++

与c的区别是,能使用std::function,可捕获变量。

#include<Windows.h>
#include<functional>
#define  WM_INVOKE WM_USER+3328
static LRESULT CALLBACK hook_proc(int code, WPARAM wParam, LPARAM lParam) {CWPSTRUCT* msg = (CWPSTRUCT*)lParam;if (msg->message == WM_INVOKE) {(*((std::function<void()>*) msg->wParam))();}return 0;
}
/// <summary>
/// 将操作切换到窗口线程执行,同步。
/// </summary>
/// <param name="hwnd">窗口句柄</param>
/// <param name="func">执行的操作</param>
void invoke(HWND hwnd, const std::function<void()>& func) {if (GetCurrentThreadId() != GetWindowThreadProcessId(hwnd, NULL)) {HHOOK hook = SetWindowsHookEx(WH_CALLWNDPROC, hook_proc, GetModuleHandle(NULL), GetWindowThreadProcessId(hwnd, NULL));SendMessage(hwnd, WM_INVOKE, (WPARAM)&func, 0);UnhookWindowsHookEx(hook);}else func();
}

四、使用示例

1、C

void action(void* arg)
{printf("invoked %d\n",(int)arg);
}
invoke(hwnd,action,123)

2、C++

int a=123;
invoke(hwnd, [&]() {printf("invoked %d\n", a);});

总结

以上就是今天要讲的内容,本文仅仅简单的实现了通用的线程invoke,且只支持同步,通用的异步invoke实现稍微复杂些(基本实现的方式则比较简单),以后有空再做。总的来说,有了本文的代码很大程度的方便了使用,尤其是一个新的项目突然需要invoke功能,按照基本实现的方式在窗口中写一遍是很麻烦的,而优化的实现则可以直接复用,调用invoke即可。

http://www.dtcms.com/wzjs/163311.html

相关文章:

  • 建站公司咨询如何搜索关键词
  • 网页做二维码哪个网站好seo高端培训
  • 网站** 教程上海何鹏seo
  • 泰安平台公司青岛seo网站排名优化
  • 灵犀科技 网站建设seo如何优化关键词排名
  • 电商的网站设计网址收录入口
  • wordpress用微信登录在哪里可以免费自学seo课程
  • php做网站的优势网络营销推广策划步骤
  • cms建站平台营销型网站和普通网站
  • 免费空间域名可以做淘宝客网站推广吗网上找客户有什么渠道
  • 手机网站打不开的解决方法百度浏览器网址
  • 中山网站开发费用免费推广平台排行榜
  • wordpress 游戏 模板下载整站优化系统厂家
  • 网站授权管理系统怎么做优化百度搜索
  • 软件下载网站哪个好用seo英文
  • 正确的网址格式怎么写企业网站seo案例分析
  • 京东联盟网站怎么做站长统计app
  • 免费自己做网站手机市场调研问卷
  • 解除网站被拦截的方法橘子seo查询
  • 东莞是什么网站建设手机软文广告300字
  • 新浪网站用什么语言做的天津百度seo排名优化
  • 网站建设的出发点行者seo无敌
  • asp网站开发需要的基本条件太原seo排名收费
  • 找个美工做淘宝网站需要多少钱关键词推广优化
  • node 做的大型网站seo的优点
  • dw建立网站之后怎么做搜索引擎调词工具哪个好
  • 校园论坛网站怎么做推广普通话宣传周
  • 西安做网站的网络公司长沙网站推广公司
  • 网站做毕业设计可靠吗产品线上推广渠道
  • 网站建设需求分析调研调查表百度推广账户登陆