如何让delay不占主程序时间
2019-12-106532
AI 快速预览详细
本文介绍了如何在Arduino编程中使用系统运行时间来实现非阻塞延时,从而避免主程序被阻塞。通过这种方法,主程序可以在延时期间继续执行其他任务,提高整体效率。具体来说,可以通过记录当前系统运行时间,并在每次循环中检查是否达到延时条件,从而实现非阻塞延时。这种技术特别适用于需要提高主程序效率的场景。
创作许可协议
本项目采用 None(不开放任何权利,保留所有权利) 进行许可。
创作许可协议
本项目采用 None(不开放任何权利,保留所有权利) 进行许可。
#include
void runmsg(void *p)
{
MessageBoxA(0, "hello world", "hello china", 0);
}
void main()
{
_beginthread(runmsg, 0, NULL); //启动线程,函数地址,把函数当做线程的入口点
_beginthread(runmsg, 0, NULL);
_beginthread(runmsg, 0, NULL);
_beginthread(runmsg, 0, NULL);
system("pause");
}[/mw_shl_code]
2. 多线程实现同步和异步:
[mw_shl_code=c,true]#include
#include
//typedef unsigned long DWORD;
//#define WINAPI __stdcall 标准的呼叫
//typedef void far *LPVOID;
DWORD WINAPI MyMseg(LPVOID lp)
{
MessageBoxA(0, "hello", "china", 0);
}
void main()
{
HANDLE hthread;
DWORD threadid; //保存线程编号
//异步执行:
//for (int i = 0; i < 5; i++)
//{
// hthread = CreateThread(
// NULL, //安全属性
// NULL, //堆栈大小
// MyMseg, //线程的入口点
// NULL, //函数的参数
// 0, //立刻执行
// &threadid //保存线程的id
// );
//}
//多线程实现同步:
for (int i = 0; i < 5; i++)
{
hthread = CreateThread(
NULL, //安全属性
NULL, //堆栈大小
MyMseg, //线程的入口点
NULL, //函数的参数
0, //立刻执行
&threadid //保存线程的id
);
WaitForSingleObject(hthread, INFINITE); //等待
CloseHandle(hthread); //关闭线程
}
system("pause");
}[/mw_shl_code]
[mw_shl_code=c,true]#include
#include
#include
#include
void run(void *p)
{
int *px = p;
printf("线程编号%d\n", *px);
}
void main()
{
int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
for (int i = 0; i < 10; i++)
{
HANDLE hd = (HANDLE) _beginthread(run, 0, &a[i]); //MyThread线程编号
WaitForSingleObject(hd, INFINITE); //单线程
//WaitForMultipleObjects() //多线程
}
system("pause");
}[/mw_shl_code]
3. 多线程检索:
[mw_shl_code=c,true]#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
#include
int isfind = 0; //找到设置为1,其他线程就不再查找
struct findInfo
{
int *pstart; //线程检索的首地址
int length; //检索的数据长度
int findNum; //需要查找的数据
int id; //线程的编号
};
void findIt(void *p)
{
struct findInfo *ps = p; //保存地址
printf("\n线程%d开始查找\n", ps->id);
//遍历首地址,长度为10个元素
for (int *pf = ps->pstart; pf < ps->pstart + ps->length; pf++)
{
if (isfind == 1)
{
printf("线程%d结束查找,其他线程已经找到\n", ps->id);
return;
}
if (*pf == ps->findNum)
{
printf("线程%d结束查找,找到数据%d地址%p\n", ps->id, *pf, pf);
isfind = 1;
return;
}
}
printf("线程%d结束查找\n", ps->id);
}
void main()
{
int a[100] = { 0 };
time_t ts;
unsigned int data = time(&ts);
srand(data); //随机数种子
for (int i = 0; i < 100; i++)
{
a[i] = rand() % 100;
printf("%4d", a[i]);
if ((i+1) % 10 == 0) //每10个打印一行
{
printf("\n");
}
}
int num;
printf("输入要查询的数:\n");
scanf("%d", &num);
struct findInfo info[10]; //结构体数组,保存每个线程要查找的信息
for (int i = 0; i < 10;i++)
{
info[i].pstart = a + 10 * i;
info[i].length = 10;
info[i].findNum = num;
info[i].id = i;
_beginthread(findIt, 0, &info[i]); //调用线程
}
system("pause");
}[/mw_shl_code]
4. 多线程切割:
[mw_shl_code=c,true]#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
#include
#include
int isfind = 0; //找到设置为1,其他线程就不再查找
struct findInfo
{
int *pstart; //线程检索的首地址
int length; //检索的数据长度
int findNum; //需要查找的数据
int id; //线程的编号
};
#define M 100 //数据
#define N 8 //线程数量
void findIt(void *p)
{
struct findInfo *ps = p; //保存地址
printf("\n线程%d开始查找\n", ps->id);
//遍历首地址,长度为10个元素
for (int *pf = ps->pstart; pf < ps->pstart + ps->length; pf++)
{
if (isfind == 1)
{
printf("线程%d结束查找,其他线程已经找到\n", ps->id);
return;
}
if (*pf == ps->findNum)
{
printf("线程%d结束查找,找到数据%d地址%p\n", ps->id, *pf, pf);
isfind = 1;
return;
}
}
printf("线程%d结束查找\n", ps->id);
}
void main()
{
int a[100] = { 0 };
time_t ts;
unsigned int data = time(&ts);
srand(data); //随机数种子
for (int i = 0; i < 100; i++)
{
a[i] = rand() % 100;
printf("%4d", a[i]);
if ((i+1) % 10 == 0) //每10个打印一行
{
printf("\n");
}
}
int num;
printf("输入要查询的数:\n");
scanf("%d", &num);
struct findInfo info[N]; //结构体数组,保存每个线程要查找的信息
if (M%N == 0) //前面能整除的情况
{
for (int i = 0; i < N; i++)
{
info[i].pstart = a + M/N * i;
info[i].length = M/N;
info[i].findNum = num;
info[i].id = i;
HANDLE hd = _beginthread(findIt, 0, &info[i]);
}
}
else //不能整除的情况
{
for (int i = 0; i < N-1; i++)
{
info[i].pstart = a + M / (N-1) * i;
info[i].length = M / (N - 1);
info[i].findNum = num;
info[i].id = i;
HANDLE hd = _beginthread(findIt, 0, &info[i]);
}
//info[N-1];
int i = N - 1;
info[i].pstart = a + M / (N - 1) * i;
info[i].length = M % (N - 1);
info[i].findNum = num;
info[i].id = i;
HANDLE hd = _beginthread(findIt, 0, &info[i]);
}
system("pause");
}[/mw_shl_code]
5. 多线程冲突:
[mw_shl_code=c,true]#include
#include
#include
#include
#include
CRITICAL_SECTION cs; //临界区,全局
int num = 0; //全局变量,多线程同时访问会发生冲突
//10 * 100 * 100
DWORD WINAPI myfun(void *p)
{
for (int i = 0; i < 100; i++)
{
EnterCriticalSection(&cs); //进入临界区
num++;
LeaveCriticalSection(&cs); //离开临界区
//Sleep(10);
}
return 0;
}
void main()
{
time_t start, end;
time(&start);
HANDLE hd[100];
for (int i = 0; i < 100; i++)
{
hd[i] = CreateThread(NULL, 0, myfun, NULL, 0, NULL);
//hd[i] = _beginthread(myfun, 0, NULL); //线程数组,数组的每一个元素都是一个线程
//WaitForSingleObject(hd[i], INFINITE); //等待单个的线程结束(同步)
}
WaitForMultipleObjects(100, hd, TRUE, INFINITE); //等待所有线程退出
time(&end);
printf("%f\n", difftime(end, start));
printf("%d\n", num);
DeleteCriticalSection(&cs);
system("pause");
}[/mw_shl_code]
还有很多可以看这里
[font=微软雅黑]C语言多线程编程[/font]