linux之通过线程实现定时处理功能

linux之通过线程实现定时处理功能

目的:需要20ms处理一次,但主线程存在阻塞。
实现方法:
对于周期要求准确的处理,放在一个线程中独立处理
具体如下:
#include “serial.h”
#include <sys/select.h>
#include <time.h>
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>

//printf(“return_value = %d\n”, TFcardState);
//printf(“WIFIName_temp = %s\n”, WIFIName_temp);
//usleep(1000000);
//互斥锁实际上就是为了防止一个线程在使用某一其他线程也能访问到的变量时,其他线程也去使用这个变量,导致变量值不可预测。
//lock
pthread_mutex_t timerMutex;
#define TIMERDATA_IT_LOCK() pthread_mutex_lock(&timerMutex)
#define TIMERDATA_IT_UNLOCK() pthread_mutex_unlock(&timerMutex)
struct timerData
{
int i;
int b;
};
struct timerData GS_timerData;
//timer manange lock

//串口控制指令
//new thread
void setTimer(int seconds,int mseconds)
{
struct timeval temp;
temp.tv_sec = seconds;
temp.tv_usec = mseconds*1000;
select(0,NULL,NULL,NULL,&temp);
}

//new timer thread
void* timeTest(void *arg)
{
int count=0;
int i = 0;
GS_timerData.i = 0;
while(1)
{
setTimer(0,20);
count++;
TIMERDATA_IT_LOCK();
GS_timerData.i++;
printf(“s=%d\n”,GS_timerData.i);
TIMERDATA_IT_UNLOCK();
}

}

int main()
{
int i=0;
pthread_t tid;
//定义锁
pthread_mutex_init(&timerMutex,NULL);
pthread_create(&tid,NULL,timeTest,“forTimeTest”);
while(1)
{
setTimer(0,80);
TIMERDATA_IT_LOCK();
GS_timerData.i++;
printf(“m=%d\n”,GS_timerData.i);
TIMERDATA_IT_UNLOCK();
}
//printf(“return_value\n”);
return 0;
}
//main是随进程创建的主线程,在主线程中创建了定时20ms处理一次的子线程。
主线程会卡500ms再处理一次,而子线程会卡20ms处理一定。
最终效果为:每接收到25个 s=后再接时收m=。说明主线程和定时线程各自的卡,不会影响对方。所以可以用此方案作定时器(void* timeTest(void *arg))
//数据如下
/usrdata # ./main
s=1
s=2
s=3
s=4
s=5
s=6
s=7
s=8
s=9
s=10
s=11
s=12
s=13
s=14
s=15
s=16
s=17
s=18
s=19
s=20
s=21
s=22
s=23
m=0
s=24
s=25
s=26
s=27
s=28
s=29
s=30
s=31
s=32
s=33
s=34
s=35
s=36
s=37
s=38
s=39
s=40
s=41
s=42
s=43
s=44
s=45
s=46
s=47
s=48
m=1
s=49
s=50
s=51
s=52
s=53
s=54
s=55
s=56
s=57
s=58
s=59
s=60
s=61
s=62
s=63
s=64
s=65
s=66
s=67
s=68
s=69
s=70
s=71
s=72
m=2

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值