lcd多线程显示bmp图片出现内存问题中断

更多资料请点击:我的目录
本篇仅用于记录自己所学知识及应用,代码仍可优化,仅供参考,如果发现有错误的地方,尽管留言于我,谢谢。

本篇记录lcd显示屏加入百叶窗效果显示bmp图片时,出现在某张bmp图片开始出现内存溢出问题。
其中报错如下:

[  199.690000] lowmemorykiller: Killing 'show' (487), adj 0,
[  199.690000]    to free 4180kB on behalf of 'show' (705) because
[  199.690000]    cache 232kB is below limit 6144kB for oom_score_adj 0
[  199.690000]    Free memory is 3176kB above reserved

造成原因:多线程运行时,父进程比子进程先退出了,没有对子进程进行回收,从而导致程序运行中断

代码如下:

pid_t id1;
id1 = fork();
if(id1 > 0)
{
	for(int i=0; i<h/2/n; i++) 								//图片的高度h / 缩放倍数n
	{
		for(int j=w*n*i,k=0; j<(w*n*i+w);j+=n,k++) 			//循环决定每行该取的像素点
		{
			//任意位置(480-h/n)/2)、(800-w/n)/2)、缩小倍数n
			*(mmap_bmp+800*(((480-h/n)/2)+i)+((800-w/n)/2)+k) = tempbuf[j];
		}
		sleep(0.1);
	}
}

else if(id1 == 0)
{
	for(int i=h/2/n-2; i<h/n; i++) 							//图片的高度h / 缩放倍数n
	{
		for(int j=w*n*i,k=0; j<(w*n*i+w);j+=n,k++) 			//循环决定每行该取的像素点
		{
			//任意位置(480-h/n)/2)、(800-w/n)/2)、缩小倍数n
			*(mmap_bmp+800*(((480-h/n)/2)+i)+((800-w/n)/2)+k) = tempbuf[j];
		}
		sleep(0.1);
	}
}

解决方法:加入父进程等待子进程退出部分

代码如下:

	pid_t id1;
	int status;
	id1 = fork();
	if(id1 > 0)
	{
		for(int i=0; i<h/2/n; i++) 								//图片的高度h / 缩放倍数n
		{
			for(int j=w*n*i,k=0; j<(w*n*i+w);j+=n,k++) 			//循环决定每行该取的像素点
			{
				//任意位置(480-h/n)/2)、(800-w/n)/2)、缩小倍数n
				*(mmap_bmp+800*(((480-h/n)/2)+i)+((800-w/n)/2)+k) = tempbuf[j];
			}
			sleep(0.1);
		}
		sleep(1);
	}
	
	else if(id1 == 0)
	{
		for(int i=h/2/n-2; i<h/n; i++) 							//图片的高度h / 缩放倍数n
		{
			for(int j=w*n*i,k=0; j<(w*n*i+w);j+=n,k++) 			//循环决定每行该取的像素点
			{
				//任意位置(480-h/n)/2)、(800-w/n)/2)、缩小倍数n
				*(mmap_bmp+800*(((480-h/n)/2)+i)+((800-w/n)/2)+k) = tempbuf[j];
			}
			sleep(0.1);
		}
		exit(1);
	}
	pid_t otherid=waitpid(id1,&status,0);  						//阻塞等待

你可能感兴趣的:(系统编程)