多线程的两个视频文件行不通的错误

本文介绍了一个基于多线程的应用案例,该案例通过生产者-消费者模式处理及压缩大型视频文件。主要实现了文件读取、数据处理、数据写入等功能,并利用线程间同步机制确保数据正确处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//server线程函数
unsigned int __stdcall ServerFun(PVOID pM)
{
	SetEvent(g_hEventBufferLeft);	
	sockte(IP, address);

	return 0;
}



//生产者线程函数
unsigned int __stdcall ProducerThreadFun(PVOID pM)
{
	unsigned char ch;
	int j = 0;
	int size;
	int Number = 1;
	FILE *fpCopy;

    point = (unsigned char*)malloc(sizeof(unsigned char)*804928);
	fp = fopen("6.avi", "rb");
	//首先保证文件中有流可以用来进行处理
	while(TRUE)
	{
		if((ch = fgetc(fp)) != EOF)
		{
			Sleep(100);
			/*for(j = 0; j < 100; j++)
			{
				fseek(fp, j, 0);
				ch = fgetc(fp);
				printf("\n%d\n", ch);
			}*/
			fseek(fp, 0, 0);
			size = filelength(fileno(fp));
			printf("%d", size);
			if(size > 82000)
			{
				break;
			}
			/*flag = TRUE;
			fclose(fp);
			break;*/
			//fread(s)
		}
	}
	while(TRUE)
	{
		//等待缓冲区为空
		WaitForSingleObject(g_hEventBufferLeft, INFINITE); 
		
		//互斥的访问缓冲区
		EnterCriticalSection(&g_cs);
		
		/*for(j = 0; j < CAPACITY; j++)
		{ 
			pFrame = cvQueryFrame(capture); 
			if(!pFrame) break;
			pFramesOne[j] = pFrame;
		}*/
		TEST = fopen(name1File, "r");
		if(!TEST)
			remove(name1File);

		//设置子文件
		if(size > 82000*Number)
		{
			fread(point , sizeof(ch), 82000, fp);
			fpCopy = fopen(nameFile, "ab");     //将其另保存为一个文件
			fseek(fpCopy, 0, SEEK_SET);
			fwrite(point, sizeof(ch), 82000, fpCopy);   //保存完成直接给压缩
			fclose(fpCopy);
			fseek(fp, 82000, 1);
		}
		_ldecod(argcCopy, argvCopy, nameFile, nameFileOut, referFile_1);
		Number++;
	

		LeaveCriticalSection(&g_cs);

		Sleep(50);
		SetEvent(g_hEventBufferLeftFull);

/*
unsigned int __stdcall ProducerThreadFun1(PVOID pM)
{
	int size;
	int Number = 2;

	fp = fopen("6.avi", "rb");
		while(TRUE)
		{
			WaitForSingleObject(g_hEventBufferRight, INFINITE); 
			
			EnterCriticalSection(&g_cs);*/
			/*while(TRUE)
			{
				size = filelength(fileno(fp));
				if(size > 82000*Number)
					break;
			}*/
		/*
			Number++;
			SetEvent(g_hEventBufferLeftFull);
		}*/

		WaitForSingleObject(g_hEventBufferRight, INFINITE);
	
		//互斥的访问缓冲区
		EnterCriticalSection(&g_cs1);
		
		TEST = fopen(nameFile, "r");     //将前一个文件清除
		if(TEST)
			remove("copy1.txt");
		//设置子文件
		if(size > 82000*Number)
		{
			fread(point , sizeof(ch), 82000, fp);
			fpCopy = fopen(name1File, "ab");     //将其另保存为一个文件
			fseek(fpCopy, 0, SEEK_SET);
			fwrite(point, sizeof(ch),82000, fpCopy);   //保存完成直接给压缩
			fclose(fpCopy);
			fseek(fp, 82000, 1);
		}

		_ldecod(argcCopy, argvCopy, nameFile, name1FileOut, referFile_2);
		Number++;
		LeaveCriticalSection(&g_cs1);

		Sleep(50);
		SetEvent(g_hEventBufferRightFull);
	}
	
	return 0;
}

//消费者线程函数
unsigned int __stdcall ConsumerThreadFun(PVOID pM)
{
	//volatile bool flag = TRUE;
	int i = 0;
	//cvNamedWindow("perFrame",1);
	//while(!flag);
	while(TRUE)
	{
			WaitForSingleObject(g_hEventBufferLeftFull, INFINITE);
			//等待缓冲区中有数据
			SetEvent(g_hEventBufferRight);
			
			//互斥的访问缓冲区
			EnterCriticalSection(&g_cs);
			//SetConsoleColor(FOREGROUND_GREEN);  //设置颜色
			//cout << "消费者取出数据" << g_Buffer;
			//SetConsoleColor(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);  
			//for(i = 0; i < CAPACITY; i++)
			//{
			//	/*cvShowImage("perFrame", pFramesOne[i]);
			//	cvWaitKey(30);*/
			//}
			LeaveCriticalSection(&g_cs);
		
			Sleep(10);
			
			WaitForSingleObject(g_hEventBufferRightFull, INFINITE);
			//等待缓冲区中有数据
			SetEvent(g_hEventBufferLeft);

			//互斥的访问缓冲区
			EnterCriticalSection(&g_cs1);
			//SetConsoleColor(FOREGROUND_GREEN);  //设置颜色
			//cout << "消费者取出数据" << g_Buffer;
			//SetConsoleColor(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);  
	
			LeaveCriticalSection(&g_cs1);
	
			Sleep(10);
	}
	return 0;
}


<think>好的,我现在需要帮用户写一个Python脚本,用来生成一个Ping测试工具。用户的要求是从IPtest.txt文件中读取IP地址,然后对每个IP进行Ping测试,记录每个IP的状态,最后汇总通和不通的数量。 首先,我得确定如何读取文件。Python中读取文本文件可以用open函数,然后读取每一行。但需要注意去除空白符,比如换行符,还有处理可能的空行。所以,在读取IP的时候,应该用strip()处理每一行,并且跳过空行。 接下来是执行Ping命令。Python中有几种方法可以执行系统命令,比如os.system、subprocess.run或者subprocess.Popen。subprocess模块更灵活,可以获取命令的输出结果。对于Ping操作,不同操作系统的命令参数可能不同。比如,Windows下是ping -n 1,而Linux/Mac是ping -c 1。所以需要判断当前操作系统,选择合适的参数。 然后,处理每个IP的Ping结果。需要判断Ping命令的返回码,或者检查输出中是否有表示成功的字符串。比如,在Windows下,如果Ping成功,返回码通常是0,但有时候可能不一致,可能需要检查输出中的“Reply from”之类的信息。而在Linux下,成功的话返回码是0,输出中会有“1 received”之类的。不过为了跨平台兼容性,可能需要统一处理返回码,或者根据系统不同处理输出。 接下来,记录每个IP的状态。可以用两个列表,比如reachable_ips和unreachable_ips,分别存储可达和不可达的IP。然后遍历每个IP,执行Ping命令后根据结果将IP添加到相应的列表中。 最后,汇总统计数量,并输出结果。需要将结果写入文件,比如输出每个IP的状态到一个文件,然后最后统计数量。 现在需要考虑可能的错误处理。比如,IP格式不正确,或者文件不存在。这时候需要用try-except块来捕获异常,比如FileNotFoundError,当IPtest.txt不存在时报错。 此外,考虑到不同系统的兼容性,使用platform模块来判断系统类型,从而选择正确的Ping命令参数。 代码的大致流程应该是: 1. 读取IP列表文件。 2. 遍历每个IP,执行Ping命令。 3. 根据命令结果判断是否可达。 4. 记录结果并统计。 5. 输出详细结果和统计信息。 可能的代码结构: - 使用with open读取文件,处理每行。 - 循环每个IP,使用subprocess.run执行命令,capture_output=True获取输出。 - 根据返回码或输出判断是否成功。 - 将结果写入输出文件。 - 最后打印统计。 需要注意的是,有些系统可能需要管理员权限来执行Ping,但一般来说普通用户权限应该足够。此外,有些防火墙设置可能会影响Ping的结果,但脚本本身无法处理这种情况,只能如实记录。 另外,用户可能需要输出到两个文件:一个记录每个IP的状态,另一个记录汇总。或者可能只需要一个汇总文件。根据用户描述,应该是每个IP的状态和最后的汇总都在同一个输出中。 可能的优化点:使用多线程或异步来加速多个IP的Ping,但用户可能不需要这么复杂,所以先实现单线程版本。 现在,编写代码: 首先处理文件读取: with open('IPtest.txt', 'r') as f: ips = [line.strip() for line in f if line.strip()] 然后,判断系统: import platform system = platform.system() count_flag = '-n' if system == 'Windows' else '-c' 对于每个IP,执行命令: import subprocess for ip in ips: result = subprocess.run(['ping', count_flag, '1', ip], capture_output=True, text=True) # 判断是否成功 if result.returncode == 0: # 可达 else: # 不可达 但可能在Windows下,即使丢包,返回码可能还是0?比如,当有部分响应时。所以可能需要检查输出中的特定字符串。例如,在Windows下,如果成功,输出中会有“Reply from”;而超时则是“Request timed out”。 所以可能需要针对不同系统处理输出: 例如: if system == 'Windows': success = 'Reply from' in result.stdout else: success = result.returncode == 0 这样更准确。 所以,在代码中,判断成功的方式应该是根据系统来检查输出或返回码。 接下来,将每个IP的结果写入文件,比如ping_results.txt: with open('ping_results.txt', 'w') as result_file: for ip in ips: # ...执行ping if success: result_file.write(f"{ip} is reachable.\n") reachable.append(ip) else: result_file.write(f"{ip} is unreachable.\n") unreachable.append(ip) 最后统计数量,并写入汇总: result_file.write(f"\nSummary:\nReachable: {len(reachable)}\nUnreachable: {len(unreachable)}") 但这样处理的话,每次循环都会打开和关闭文件,效率不高。更好的方法是在处理完所有IP后,一次性写入结果。或者,在循环中追加写入,但这样可能会影响性能。不过对于少量IP来说没问题。 不过,更高效的方式是先处理所有IP,收集结果,最后一次性写入。 所以,调整流程: 处理每个IP时,将结果存入列表,最后再写入文件。或者同时记录到两个列表,并生成结果字符串。 或者,在循环中逐个处理并写入。 现在,综合以上分析,写出完整的代码: 注意,需要导入必要的模块,处理文件读取,执行命令,判断结果,记录结果,输出到文件。 同时,处理可能的异常,比如文件不存在。 所以,完整的代码可能如下: import subprocess import platform def ping_ip(ip): """Ping一个IP地址,返回是否可达""" param = '-n' if platform.system().lower() == 'windows' else '-c' command = ['ping', param, '1', ip] try: response = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, timeout=5) if platform.system().lower() == 'windows': return 'Reply from' in response.stdout else: return response.returncode == 0 except subprocess.TimeoutExpired: return False reachable = [] unreachable = [] try: with open('IPtest.txt', 'r') as file: ips = [line.strip() for line in file if line.strip()] except FileNotFoundError: print("错误:IPtest.txt文件未找到。") exit() for ip in ips: if ping_ip(ip): reachable.append(ip) else: unreachable.append(ip) with open('ping_results.txt', 'w') as result_file: result_file.write("各IP状态:\n") for ip in ips: status = '可达' if ip in reachable else '不可达' result_file.write(f"{ip}: {status}\n") result_file.write(f"\n汇总:\n可达IP数:{len(reachable)}\n不可达IP数:{len(unreachable)}") print("执行完成,结果已保存到ping_results.txt") 这个代码中,定义了一个ping_ip函数来处理不同系统的Ping命令。在Windows下检查输出是否包含'Reply from',其他系统检查返回码是否为0。同时,处理超时情况,避免长时间等待。 需要注意,subprocess.run的timeout参数设置为5秒,如果Ping超过5秒没有完成,视为超时,不可达。这可能在某些情况下需要调整,但作为默认值合适。 最后,将结果写入ping_results.txt,包括每个IP的状态和汇总。 可能的问题: 1. 某些环境下,Ping命令可能需要不同的参数? 2. 需要管理员权限吗?通常不需要。 3. 是否处理了IPv6地址?当前代码可能不处理,但用户提供的文件中的IP格式是否正确需要用户自己保证。 现在,用户的问题已经解决,代码应该可以工作。</think><< 以下是实现Ping测试脚本的Python代码,该脚本从IPtest.txt读取IP地址,测试连通性,并输出结果: ```python import subprocess import platform def check_ip_status(ip): """检查单个IP的连通性""" param = '-n'1' if platform.system().lower() == 'windows' else '-c1' command = ['ping', param, ip] try: output = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, timeout=5) if platform.system().lower() == 'windows': return 'Reply from' in output.stdout return output.returncode == 0 except subprocess.TimeoutExpired: return False # 读取IP列表 try: with open('IPtest.txt', 'r') as f: ips = [line.strip() for line in f if line.strip()] except FileNotFoundError: print("错误:IPtest.txt文件不存在") exit() reachable = [] unreachable = [] # 测试每个IP for ip in ips: if check_ip_status(ip): reachable.append(ip) else: unreachable.append(ip) # 写入结果文件 with open('ping_results.txt', 'w') as f: f.write("IP状态报告:\n") f.write("="*30 + "\n") for ip in ips: status = "可达" if ip in reachable else "不可达" f.write(f"{ip.ljust(15)}: {status}\n") f.write("\n汇总统计:\n") f.write(f"可达IP数量:{len(reachable)}\n") f.write(f"不可达IP数量:{len(unreachable)}") print(f"测试完成!结果已保存到ping_results.txt") ``` 实现原理: 1. 使用platform模块检测操作系统类型,自动适配Windows(使用-n参数)和Linux/Mac(使用-c参数) 2. subprocess.run执行ping命令并捕获输出 3. Windows系统通过检测"Reply from"关键词判断是否ping通 4. 其他系统通过返回码判断(0表示成功) 5. 设置5秒超时防止长时间阻塞 6. 结果文件包含详细状态和统计摘要 注意事项: 1. 需要将IP地址按行保存在IPtest.txt文件中 2. 某些网络环境可能限制ICMP协议 3. 管理员权限通常不需要但可能影响某些特殊网络环境 4. 实际延迟可能受网络状况影响
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值