使用postmessage实现进程间通信的示例教程

版权申诉
0 下载量 176 浏览量 更新于2024-10-11 收藏 5.21MB RAR 举报
资源摘要信息:"两个进程间postmessage通信示例" 知识点: 1. PostMessage函数的理解与应用 PostMessage是Windows API中的一个函数,用于在进程间传递消息。该函数允许一个进程向另一个进程的窗口发送消息。即使接收窗口在其他线程中,也同样有效。它通常用于不同应用程序之间的简单通信。在描述中提到的“postmessage”例子,可能是指使用PostMessage函数来实现跨进程通信(IPC)的示例代码或程序。 2. 跨进程通信IPC (Inter-Process Communication) 跨进程通信是指两个或多个进程之间的数据交换和通信机制。在操作系统中,有多种IPC机制,包括管道、消息队列、信号量、共享内存、套接字等。在本例中,PostMessage提供了一种基于消息传递的IPC方法,允许进程间不需要共享内存、套接字等方式即可进行通信。 3. Windows消息循环机制 Windows应用程序是基于消息驱动的,这意味着程序的执行是基于接收到的消息。每一个窗口都必须有一个消息循环来处理发往该窗口的消息。消息循环通过调用GetMessage或PeekMessage函数来从消息队列中获取消息,并使用DispatchMessage函数将消息分发到相应的窗口过程(Window Procedure)进行处理。 4. 使用PostMessage的注意事项和限制 使用PostMessage进行进程间通信虽然简单,但它有一些限制和潜在的问题。例如,消息发送的目标窗口必须在消息队列中,否则消息将不会被传递。此外,它不适合传递大量数据或者需要高效率通信的场景。在描述中提及的“例子”,可能涉及如何正确使用PostMessage,如何处理返回值以及可能遇到的问题和解决方案。 5. 进程和线程的区别 在讨论进程间通信时,有必要了解进程与线程的区别。进程是程序的执行实例,拥有独立的地址空间;线程是进程中的执行单元,共享进程的资源。本例中的“两个进程”指的是两个独立的程序实例。理解这一概念有助于深入学习跨进程通信机制。 6. 消息的类型和结构 Windows中消息是一个包含了消息代码、wParam和lParam参数的数据结构。消息代码标识了消息的类型,如按键事件、窗口重绘事件等。wParam和lParam是额外的数据参数,其具体含义依赖于消息类型。了解消息的结构对于编写处理消息的代码是必不可少的。 7. 实现跨进程通信的其他方法 尽管本例专注于PostMessage,但了解其他IPC方法是很有用的。这些方法包括但不限于:命名管道(Named Pipes)、剪贴板、文件映射、远程过程调用(RPC)等。每种方法都有其特定的使用场景和优缺点。 8. 安全性考虑 当进行进程间通信时,安全问题必须被考虑进去。确保传递的消息不包含敏感信息,并且通信双方的身份能够得到验证是非常重要的。错误地处理跨进程通信可能导致安全漏洞,比如注入攻击或者拒绝服务攻击。 通过上述内容,我们可以得知,该压缩包文件 "progress_send_message.rar" 中可能包含了一个示例或教程,专门针对Windows平台上使用PostMessage函数实现进程间通信的情景。开发者可以借助这份资料,学习如何在实际开发中运用PostMessage进行跨进程通信,以及与之相关的知识点。对于希望在Windows环境下开发相关功能的开发者而言,这份资源可能非常有价值。
2023-06-09 上传

/* * @Author: LinLong * @LastEditors: LinLong * @Description: 上课进度上传 */ import { ref, onMounted, onUnmounted } from 'vue' import { getItem, setItem } from '@/hooks' import { uselearningProgress } from '@/stores' import { updatedLearningProgress } from '@/apiList/learningProgress' const learningProgressStore = uselearningProgress() //学习进度仓库 const currentProgressFile = ref(null) //当前学习进度文件 const heartbeatTime = 30 * 1000 //30秒 let timer = null //时间函数 export function useClassProgress(onBeforeRouteLeave) { //从仓库获取用户点击的课程->项目->任务->文件 learningProgressStore.$subscribe((mutation, state) => { const { currentProgress } = state // console.log('%c--currentProgress-->', 'background:#18C36E;color:#3F4040;', currentProgress) currentProgressFile.value = { classId: currentProgress.classId, courseId: currentProgress.courseId, courseId_text: currentProgress.courseId_text, projectId: currentProgress.pid == 0 ? currentProgress.id : currentProgress.pid, // projectId: currentProgress.id, taskId: currentProgress.pid == 0 ? null : currentProgress.id, pid_text: currentProgress.pid_text, name: currentProgress.name, file: currentProgress.url, userId: getItem('userInfo').id, } // console.log('%c-----state 学习进度------->', 'background:#18C36E;color:#3F4040;', currentProgress) }) //生命周期页面挂载完毕 onMounted(() => { //接收iframe 异步框架消息 window.addEventListener('message', (e) => { if (e.origin.includes('8013')) { const data = e.data setItem('postMessage', data) // console.log('%c-----监听postMessage子级------->', 'background:#18C36E;color:#3F4040;', JSON.parse(data)) } }) //浏览器tab标签切换或最小化事件设置暂停提交 上课记录 document.addEventListener('visibilitychange', () => { if (document.visibilityState === 'hidden') { timer ? clearTimeout(timer) : (timer = null) //清除定时器 } else if (document.visibilityState === 'visible') { timer ? clearTimeout(timer) : (timer = null) //先清除一次定时器 sendMessage() //继续发送学习进度 } }) //发送统计信息至后端 sendMessage() function sendMessage() { console.log('%c---对方水电费水电费水电费->', 'background:#18C36E;color:#3F4040;') timer ? clearTimeout(timer) : (timer = false) //先清除一次定时器 timer = setTimeout(() => { const sendData = { ...getItem('postMessage'), ...currentProgressFile.value, } // console.log('%c------准备发送的信息sendData------>', 'background:#18C36E;color:#3F4040;', sendData) updatedLearningProgress(sendData).then((res) => { if (res.success) sendMessage() }) }, heartbeatTime) //heartbeatTime } }) //生命周期页面销毁之前 onUnmounted(() => { clearTimeout(timer) // //路由离开 // onBeforeRouteLeave(() => { // clearTimeout(timer) // }) }) }

2023-04-20 上传