xfalcon 发表于 2019-12-10 10:47:42

如何让delay不占主程序时间


如何让delay不占主程序时间呢,目前的想法是如何才能每执行一条digitalWrite.然后就跳出去运行主程序一遍然后执行第二条digitalWrite


计时的已达成条件就卡死

Forgotten 发表于 2019-12-10 10:47:43

系统运行时间也可以

gckulo 发表于 2019-12-10 10:52:28

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语言多线程编程


xfalcon 发表于 2019-12-11 15:38:28

Forgotten 发表于 2019-12-11 09:36
系统运行时间也可以

谢谢{:5_116:}
页: [1]
查看完整版本: 如何让delay不占主程序时间