查看: 269|回复: 3

[已解决] 如何让delay不占主程序时间

[复制链接]
20创造力
A30184D4A8058FFE502A0489DA3FC676.png
如何让delay不占主程序时间呢,目前的想法是如何才能每执行一条digitalWrite.然后就跳出去运行主程序一遍然后执行第二条digitalWrite

201912101960..png
计时的已达成条件就卡死

最佳答案

查看完整内容

系统运行时间也可以

Forgotten  版主

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

回复

使用道具 举报

gckulo  高级技师

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

1. Windows下同时打开多个对话框:
[C] 纯文本查看 复制代码
#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. 多线程实现同步和异步:
[C] 纯文本查看 复制代码
#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");
}


[C] 纯文本查看 复制代码
#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[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");
}


3. 多线程检索:
[C] 纯文本查看 复制代码
#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[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");
}


4. 多线程切割:
[C] 纯文本查看 复制代码
#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[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");
}


5. 多线程冲突:
[C] 纯文本查看 复制代码
#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[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");
}


还有很多可以看这里
C语言多线程编程


回复

使用道具 举报

xfalcon  管理员
 楼主|

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

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

谢谢
回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies |上传

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2020 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail