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

版权申诉
0 下载量 119 浏览量 更新于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 上传

public class MainActivity extends AppCompatActivity { private EditText ipEditText; private EditText portEditText; private TextView messageTextView; private BufferedReader in; private PrintWriter out; private Socket socket; private Handler handler = new Handler(); @SuppressLint("MissingInflatedId") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ipEditText = findViewById(R.id.ipEditText); portEditText = findViewById(R.id.portEditText); messageTextView = findViewById(R.id.messageTextView); Button connectButton = findViewById(R.id.connectButton); connectButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String ip = ipEditText.getText().toString(); int port = Integer.parseInt(portEditText.getText().toString()); new Thread(new Runnable() { @Override public void run() { try { socket = new Socket(ip, port); in = new BufferedReader(new InputStreamReader(socket.getInputStream())); out = new PrintWriter(socket.getOutputStream(), true); // 在主页面中的窗口中实时显示消息 new Thread(new Runnable() { @Override public void run() { try { while (true) { String message = in.readLine(); if (message == null) { break; } handler.post(new Runnable() { @Override public void run() { messageTextView.setText(message+"\n"); } }); } } catch (IOException e) { e.printStackTrace(); } } }).start(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }).start(); } });能帮我把代码中的在主页面实时显示消息的功能换成滑动一个半圆进度条,按进度条百分比发送数字的功能吗

2023-05-31 上传

/* * @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 上传

private EditText ipEditText; private EditText portEditText; private TextView messageTextView; private BufferedReader in; private PrintWriter out; private Socket socket; private Handler handler = new Handler(); @SuppressLint("MissingInflatedId") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ipEditText = findViewById(R.id.ipEditText); portEditText = findViewById(R.id.portEditText); Button connectButton = findViewById(R.id.connectButton); connectButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String ip = ipEditText.getText().toString(); int port = Integer.parseInt(portEditText.getText().toString()); new ConnectTask().execute(ip, String.valueOf(port)); } }); Button sendMessageButton = findViewById(R.id.sendMessageButton); sendMessageButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { showSendMessageDialog(); } }); } private class ConnectTask extends AsyncTask<String, Void, Void> { @Override protected Void doInBackground(String... params) { String ip = params[0]; int port = Integer.parseInt(params[1]); try { socket = new Socket(ip, port); in = new BufferedReader(new InputStreamReader(socket.getInputStream())); out = new PrintWriter(socket.getOutputStream(), true); // 获取SeekBar对象 SeekBar progressBar = findViewById(R.id.progressBar); // 添加OnSeekBarChangeListener监听器 progressBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { // 计算百分比对应的数字 int number = progress * 10; int tnum = 0; tnum = number; out.println(tnum); } @Override public void onStartTrackingTouch(SeekBar seekBar) {} @Override public void onStopTrackingTouch(SeekBar seekBar) {} }); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; } } @Override protected void onDestroy() { super.onDestroy(); try { if (in != null) { in.close(); } if (out != null) { out.close(); } if (socket != null) { socket.close(); } } catch (IOException e) { e.printStackTrace(); } } private void showSendMessageDialog() { AlertDialog.Builder builder = new AlertDialog.Builder(this); LayoutInflater inflater = getLayoutInflater(); View view = inflater.inflate(R.layout.dialog_send_message, null); final EditText messageEditText = view.findViewById(R.id.messageEditText); builder.setView(view) .setTitle("发送消息") .setPositiveButton("发送", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { String message = messageEditText.getText().toString(); if (out != null) { new Thread(new Runnable() { @Override public void run() { out.println(message); } }).start(); } } }) .setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }) .create() .show(); }代码有问题,修改一下

2023-06-01 上传