一、思路流程
创建一个新线程用来控制亮度,线程通过读取用户输入来增加或减少亮度值,并使用 ioctl
函数将新亮度值设置到视频设备。
二、代码
/*创建线程来控制亮度*/
pthread_t thread;
pthread_create(&thread, NULL, thread_brightness_contrl,(void*)fd);
static void*thread_brightness_contrl(void* args)
{
int fd = (int)args;
unsigned char c;
int brightness;
int delta;
struct v4l2_queryctrl qctrl;
memset(&qctrl,0,sizeof(qctrl));
qctrl.id = V4L2_CID_BRIGHTNESS;
if(0 != ioctl(fd,VIDIOC_QUERYCTRL,&qctrl))
{
printf("can not query brightness\n");
return NULL;
}
printf("brightness min = %d,max = %d\n",qctrl.minimum,qctrl.maximum);
struct v4l2_control ctl;
ctl.id = V4L2_CID_BRIGHTNESS;
ioctl(fd, VIDIOC_G_CTRL,&ctl);
while(1)
{
c= getchar();
if (c=='u'||c=='U')
{
ctl.value += delta;
}
else if(c =='D'||c=='d')
{
ctl.value -=delta;
}
if(ctl.value >= qctrl.maximum) ctl.value = qctrl.maximum;
if(ctl.value <= qctrl.minimum) ctl.value = qctrl.minimum;
ioctl(fd,VIDIOC_S_CTRL,&ctl);
}
return NULL;
};
三、知识点补充
while循环关键点
-
阻塞等待 :当执行
c = getchar();
时,如果没有输入,程序会在这里阻塞。这意味着线程会在此暂停,直到用户输入一个字符。 -
循环继续 :一旦用户输入一个字符,
getchar()
返回字符并继续执行循环的剩余部分。循环并未终止,它只是被阻塞等待输入。 -
线程挂起 :由于
getchar()
阻塞等待输入,线程会被挂起,等待输入字符。挂起状态并不意味着while
循环终止,而是线程暂停在getchar()
这行代码。