多个线程的时间同步

1. 如果做游戏开发,为了时间单独写一个线程不太划算,CreateWaitableTimerA之类的是内核对象,因为多个时钟都有同一个名称,就可以让多个线程同时读取一个时钟。。

2. 如果要用到多个定时器,应该设定好每个定时器的名字,如果是匿名那就只能是一个。

#include<stdio.h>
#include <stdlib.h>
#include <Windows.h>

int main()
{

    HANDLE time1 = CreateWaitableTimerA(NULL, TRUE, "haihua");
    if (time1==NULL)
    {
        printf("创建失败");

    }
    LARGE_INTEGER mytime;  //大整数,其本质是一个结构体
    mytime.QuadPart = -50000000; //单位是0.1微秒,设置为5秒之后启动定时器。

    if (!SetWaitableTimer(time1,&mytime,0,0,0,0))
    {
        printf("设置失败");
    }
    if (WaitForSingleObject(time1,INFINITE)==WAIT_OBJECT_0)
    {  //如果等于WAIT_OBJECT_0,意味着得到消息。
        printf("wait ok");
    }
    else
    {
        printf("wait no");
    }

    system("pause");
}

时间定时器还允许回调函数

#include<stdio.h>
#include <stdlib.h>
#include <Windows.h>

//函数指针作为参数,他调用的函数就是回调函数。
VOID   CALLBACK  timerun(void *parg,DWORD timearg,DWORD  timehigh)
{

    DWORD dwindex = *(DWORD *)parg;
    printf("\n第%d次", dwindex);

    //MessageBoxA(0, "1", "2", 0);

}

int main()
{

    HANDLE time1 = CreateWaitableTimerA(NULL, TRUE, "haihua");//创建始终

    if (time1 == NULL)
    {
        printf("创建失败");

    }
    LARGE_INTEGER mytime;
    mytime.QuadPart = -50000000; //0.1微妙,

    DWORD dwparam = 1;//设置定时器

    if (SetWaitableTimer(time1, &mytime, 3000, timerun, &dwparam, FALSE))
    {  //3000,表示3000毫秒执行一次循环。
        printf("等待5秒开始干活");
        for (int i = 0; i < 15; i++, dwparam++)//循环多少次
        {
            SleepEx(INFINITE, TRUE);
        }

    }

    CancelWaitableTimer(time1);//取消定时器
    CloseHandle(time1);

    system("pause");
}
时间: 2024-08-24 18:08:29

多个线程的时间同步的相关文章

事件实现中介者对话

互斥,解决线程冲突 事件,解决线程通信 临界区,解决线程冲突 时间,同步线程 有时线程之间的信号不同步或者乱序.这时需要信号复位. event[0] = CreatEvent(NULL, TRUE, FALSE, NULL);//第二个参数:TRUE代表手动复位 (就是用ResetEvent),  FALSE代表自动进行信号复位//第三个参数:信号的状态//第四个参数:信号标记名称ResetEvent(event[0]);    //信号复位 信号你用完了之后,再次利用,这中间就会发生冲突问题,

各科基础详实

一. Java基础部分 1. JAVA的基本数据类型有哪些 ?  String 是不是基本数据类型 ? 2. 一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 3. Java有没有goto? 7 4. 说说&和&&的区别. 7 5. 在JAVA中如何跳出当前的多重嵌套循环? 7 6. switch语句能否作用在byte上,能否作用在long上,能否作用在String上? 8 7. short s1 = 1; s1 = s1 + 1;有什么

python之路 -- 并发编程之线程

进程 是 最小的内存分配单位 线程 是 操作系统调度的最小单位 线程直接被CPU执行,进程内至少含有一个线程,也可以开启多个线程 开启一个线程所需要的时间要远远小于开启一个进程 GIL锁(即全局解释器锁) 锁的是线程 在Cpython解释器下的python程序 在同一时刻 多个线程中只能有一个线程被CPU执行 1.创建线程的两中方式: import time from threading import Thread def func(args): time.sleep(1) print(args

Python之路(第四十五篇)线程Event事件、 条件Condition、定时器Timer、线程queue

一.事件Event Event(事件):事件处理的机制:全局定义了一个内置标志Flag,如果Flag值为 False,那么当程序执行 event.wait方法时就会阻塞,如果Flag值为True,那么event.wait 方法时便不再阻塞. Event其实就是一个简化版的 Condition.Event没有锁,无法使线程进入同步阻塞状态. Event() set(): 将标志设为True,并通知所有处于等待阻塞状态的线程恢复运行状态. clear(): 将标志设为False. wait(time

python语法基础-并发编程-线程-长期维护

###############   线程和GIL,全局解释器锁    ############## """ 线程 为什么会有进程? 主要是能够同时处理多个任务,多个任务还要进行切换,时间片轮转 为什么会有线程? 进程并不是执行任务的最小单元,每一个进程里面有都一个线程,我们叫做主线程, 早期没有线程,一个进程只能干一个任务,如果有多个任务,只能多起进程,进程太多不行的, 进程内部的内存是共享的,所以需要线程,否则还要涉及到进程间的通信,这比较浪费资源 所以线程的出现解决了两个

Java四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor

介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? Java new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub } }).start(); 1 2 3 4 5 6 7 new Thread(new

201709018工作日记--线程状态的转换

先来张图: 线程在一定条件下,状态会发生变化: 1.新建状态(New):新创建了一个线程对象 2.就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权. 3.运行状态(Running):就绪状态的线程获取了CPU,执行程序代码. 4.阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行.直到线程进入就绪状态,才有机会转到运行状态.阻塞的情况分三种:   (一).等

POSIX 线程详解(经典必看)

总共三部分: 第一部分:POSIX 线程详解                                   Daniel Robbins ([email protected]), 总裁/CEO, Gentoo Technologies, Inc.  2000 年 7 月 01 日 第二部分:通用线程:POSIX 线程详解,第 2部分       Daniel Robbins ([email protected]), 总裁/CEO, Gentoo Technologies, Inc.  20

线程的控制和线程池

一.WaitHandle: ”.Net 中提供了一些线程间更自由通讯的工具,他们提供了通过"信号"进行通讯的机制 可以通过ManualResetEvent,AutoResetEvent(他是在开门并且一个 WaitOne 通过后自动关门)来进行线程间的通讯 waitOne:    等待开门 Set:           开门 Reset:       关门 static void Main(string[] args) { ManualResetEvent mre = new Manu