1 你需要了解一下CPU处理逻辑
一个核心的CPU,一个时钟只能处理一个事情。
比如你构建一个窗口程序,这个窗口本身在show的时候,就是处于一个死循环事件,其中的点击事件等等,都是在这个主线程之下的其他分支任务,所以,窗口或者其子窗口,子控件等,都是一个事情
现在,有个甲方希望引入外键的输入事件,这是一件独立于子窗口的事情,你想要在处理子窗口的同时再同时执行对外键的输入的读取,这本身是一件强人锁男的事情,当然,也不是没有办法,你可以通过线程的方式,当然,线程方式的逻辑其实是均匀分配核心的运算资源,从总体上看,还是串行的,只是,现在在运行窗口线程的同时又叠加了其他的线程,固然是一种方法,但是,当线程多了,对线程的上下文的切换本身花费的资源远远的超过线程处理的事件时,开多个线程,对资源的浪费是一定的。
那么为了解决在处理一个事情的同时,还能处理另外一个事情,就需要设计一种新的任务模式,我们称之为中断。
中断是一种更底层的概念,因为通常情况下,中断是由硬件来进行支撑的,而不是软件支撑的,它的定义,可以有效的帮助你去解决处理一件事情的同时还能处理另外的事情,处理完成之后继续处理UI线程的任务,是一种非常棒的任务模式
在c++中使用中断很简单:
void key_interrupt_service_1() //中断函数
{
delay(100); //按键消抖
if(digitalRead(3) == 0)
{
task_3_v1 += 1;
qDebug()<<task_3_v1<<" = vs";
}
}
void key_init(int gpioPort) //初始化函数
{
pinMode(gpioPort, INPUT);
pullUpDnControl(gpioPort, PUD_UP); //设置上拉电阻
//注册中断程序
wiringPiISR(gpioPort, INT_EDGE_FALLING, &key_interrupt_service_1);
}
很容易理解,当我按键的时候,会监听到gpio的输入信号,此时信号就是一个下跳沿,发生这个下跳沿,就会触发中断,然后去寻找中断程序的地址,这种算法是一种很棒的算法。