如何让delay不占主程序时间
如何让delay不占主程序时间呢,目前的想法是如何才能每执行一条digitalWrite.然后就跳出去运行主程序一遍然后执行第二条digitalWrite
计时的已达成条件就卡死
系统运行时间也可以 1. Windows下同时打开多个对话框:#include <Windows.h>
#include <process.h> //创建线程
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");
}
2. 多线程实现同步和异步:
#include <Windows.h>
#include <stdlib.h>
//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");
}
#include <stdio.h>
#include <stdlib.h>
#include <process.h>
#include <Windows.h>
void run(void *p)
{
int *px = p;
printf("线程编号%d\n", *px);
}
void main()
{
int a = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
for (int i = 0; i < 10; i++)
{
HANDLE hd = (HANDLE) _beginthread(run, 0, &a); //MyThread线程编号
WaitForSingleObject(hd, INFINITE); //单线程
//WaitForMultipleObjects() //多线程
}
system("pause");
}
3. 多线程检索:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h> //生成随机数
#include <process.h>
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 = { 0 };
time_t ts;
unsigned int data = time(&ts);
srand(data); //随机数种子
for (int i = 0; i < 100; i++)
{
a = rand() % 100;
printf("%4d", a);
if ((i+1) % 10 == 0) //每10个打印一行
{
printf("\n");
}
}
int num;
printf("输入要查询的数:\n");
scanf("%d", &num);
struct findInfo info; //结构体数组,保存每个线程要查找的信息
for (int i = 0; i < 10;i++)
{
info.pstart = a + 10 * i;
info.length = 10;
info.findNum = num;
info.id = i;
_beginthread(findIt, 0, &info); //调用线程
}
system("pause");
}
4. 多线程切割:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <time.h> //生成随机数
#include <process.h>
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 = { 0 };
time_t ts;
unsigned int data = time(&ts);
srand(data); //随机数种子
for (int i = 0; i < 100; i++)
{
a = rand() % 100;
printf("%4d", a);
if ((i+1) % 10 == 0) //每10个打印一行
{
printf("\n");
}
}
int num;
printf("输入要查询的数:\n");
scanf("%d", &num);
struct findInfo info; //结构体数组,保存每个线程要查找的信息
if (M%N == 0) //前面能整除的情况
{
for (int i = 0; i < N; i++)
{
info.pstart = a + M/N * i;
info.length = M/N;
info.findNum = num;
info.id = i;
HANDLE hd = _beginthread(findIt, 0, &info);
}
}
else //不能整除的情况
{
for (int i = 0; i < N-1; i++)
{
info.pstart = a + M / (N-1) * i;
info.length = M / (N - 1);
info.findNum = num;
info.id = i;
HANDLE hd = _beginthread(findIt, 0, &info);
}
//info;
int i = N - 1;
info.pstart = a + M / (N - 1) * i;
info.length = M % (N - 1);
info.findNum = num;
info.id = i;
HANDLE hd = _beginthread(findIt, 0, &info);
}
system("pause");
}
5. 多线程冲突:
#include <stdio.h>
#include <stdlib.h>
#include <process.h>
#include <Windows.h>
#include <time.h>
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;
for (int i = 0; i < 100; i++)
{
hd = CreateThread(NULL, 0, myfun, NULL, 0, NULL);
//hd = _beginthread(myfun, 0, NULL); //线程数组,数组的每一个元素都是一个线程
//WaitForSingleObject(hd, INFINITE); //等待单个的线程结束(同步)
}
WaitForMultipleObjects(100, hd, TRUE, INFINITE); //等待所有线程退出
time(&end);
printf("%f\n", difftime(end, start));
printf("%d\n", num);
DeleteCriticalSection(&cs);
system("pause");
}
还有很多可以看这里
C语言多线程编程
Forgotten 发表于 2019-12-11 09:36
系统运行时间也可以
谢谢{:5_116:}
页:
[1]