C# 多进程引发的问题

最近正在开发使用ffmpeg完成对摄像头的录像的程序,需求里面提到需要在触发开始标志与结束标志的时候分别开始和结束录像,刚开始计划直接使用ffmpeg即可完成功能,但是当开发过程中发现并不可以完全的实现功能,因为ffmpeg可以录制指定长度的视频,但是本项目中在开始录像的时候是不知道这个指定长度的,因此想到只有在启动ffmpeg的进程上做文章。

果不其然,使用结束进程的方式确实可以完成功能,具体思路如下,在接收到结束标志的时候,直接将进程kill掉,千万不要使用process的dispose,close等,会报错的,直接一句kill即可达到你的要求,本来以为已经完成功能,但仔细测试发现,ffmpeg录制的视频长度只有10秒左右的长度,不会录制再长的长度,这一下陷入的坑内,发现了一个有趣的现象,一旦将主程序关闭,ffmpeg.exe还会继续执行,很明显:录制视频的进程被父进程阻塞了,但是一直不知道阻塞的缘由是什么,两个进程不存在共享资源等的情况。

这个问题困扰了自己一个晚上,第二天继续调试依然会有相应的问题出现,在网上找到了相关java关于阻塞的帖子,但都是与I/O交互,其中有一篇提到需要设置process(对象).RedirectStandardInput,与RedirectStandardError属性为true,反映到这个是与命令行交互的需要设置这两个属性,但是ffmpeg这个进程不需要与命令行交互应该就不需要设置这两个属性,将两个属性注释掉,测试,问题解决。

时间: 2024-10-12 21:19:37

C# 多进程引发的问题的相关文章

PHP多进程引发的msyql连接数问题

PHP多进程引发的msyql连接数问题 业务中有一块采用了PHP的pcntl_fork多进程,希望能提高效率,但是在执行的时候数据库报错 PDO::prepare(): Premature end of data (mysqlnd_wireprotocol.c:1244) Packets out of order. Expected 1 received 108. Packet size=7102829 发现应该是短时间大量的链接写入数据库.导致数据库无法响应 show variables li

第二章IPC——IPC与开启多进程

问题 一.IPC ①.什么是IPC  ②.为什么要有IPC 二.多进程 ①.如何开启多进程  ②.系统如何创建多进程 三.多进程引发的问题 问:私有进程(利用":+进程名")能否共享数据? 只能够共享data信息和组件信息...不能共享数据.

操作系统学习---进程管理(二)

要点: 基础:进程描述及控制 策略:进程调度 实现:互斥与同步 避免:死锁与饥饿 解决:几个经典问题 进程的引入 程序的顺序执行 源代码程序,目标程序和可执行程序 程序执行:编辑,编译,链接,执行 程序的结构:顺序,分支,循环结构 程序执行的特征:顺序性,封闭性,可再现性 程序并发执行 多道程序设计技术:多个程序并发执行 程序并发执行时的特征:间断性,非封闭性,不可再现性 并发执行引发的问题: 协调各程序的执行顺序:输入数据还未全部输入内存时,计算必须等待 多个执行程序共享系统资源,程序之间可能

由linux下的多进程编程引发的关于进程间隔离的思考

源代码放到了三个文件中: #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/wait.h> #include <sys/types.h> includeall.h #include "includeall.h" int my_sum(int a,int b)//calculate the sum from a to b { int

Python 3 并发编程多进程之队列(推荐使用)

Python 3 并发编程多进程之队列(推荐使用) 进程彼此之间互相隔离,要实现进程间通信(IPC),multiprocessing模块支持两种形式:队列和管道,这两种方式都是使用消息传递的. 可以往队列里放任意类型的数据 创建队列的类(底层就是以管道和锁定的方式实现): 1 Queue([maxsize]):创建共享的进程队列,Queue是多进程安全的队列,可以使用Queue实现多进程之间的数据传递. 参数介绍: 1 maxsize是队列中允许最大项数,省略则无大小限制. 方法介绍: 1.主要

python多线程、多进程以及GIL

多线程 使用threading模块创建线程 传入一个函数 这种方式是最基本的,即调用threading中的Thread类的构造函数,然后指定参数target=func,再使用返回的Thread的实例调用start()方法,即开始运行该线程,该线程将执行函数func,当然,如果func需要参数,可以在Thread的构造函数中传入参数args=(-).示例代码如下 import threading #用于线程执行的函数 def counter(n): cnt = 0; for i in xrange

Android开发必知会的多进程详解

在计算机操作系统中,进程是进行资源分配和调度的基本单位.这对于基于Linux内核的Android系统也不例外.在Android的设计中,一个应用默认有一个(主)进程.但是我们通过配置可以实现一个应用对应多个进程. 本文将试图对于Android开发中应用多进程做一些整理总结. android:process · 应用实现多进程需要依赖于android:process这个属性 · 适用元素:Application, Activity, BroadcastReceiver, Service, Cont

【Linux】多进程与多线程之间的区别

http://blog.csdn.net/byrsongqq/article/details/6339240 网络编程中设计并发服务器,使用多进程与多线程 ,请问有什么区别?  答案一: 1,进程:子进程是父进程的复制品.子进程获得父进程数据空间.堆和栈的复制品. 2,线程:相对与进程而言,线程是一个更加接近与执行体的概念,它可以与同进程的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列. 两者都可以提高程序的并发度,提高程序运行效率和响应时间. 线程和进程在使用上各有优缺点:线程执行开

多进程与多线程

一 进程与线程的概念 1.1 进程 考虑一个场景:浏览器,网易云音乐以及notepad++ 三个软件只能顺序执行是怎样一种场景呢?另外,假如有两个程序A和B,程序A在执行到一半的过程中,需要读取大量的数据输入(I/O操作),而此时CPU只能静静地等待任务A读取完数据才能继续执行,这样就白白浪费了CPU资源.你是不是已经想到在程序A读取数据的过程中,让程序B去执行,当程序A读取完数据之后,让程序B暂停.聪明,这当然没问题,但这里有一个关键词:切换. 既然是切换,那么这就涉及到了状态的保存,状态的恢