zoukankan      html  css  js  c++  java
  • 如何使用queue_delayed_work函数

    本文转自如何使用queue_delayed_work函数
    1. delayed_workqueue主要用在需要延迟处理任务的驱动中,这些驱动的特性主要是不能使用中断。
    delayed_workqueue的使用步骤如下:
       1) 定义workqueue要做的delayed工作:struct delayed_work mdelayed_work;
       2) 定义workqueue: struct workqueue_struct *mworkqueue; 
       3) 初始化workqueue:INIT_DELAYED_WORK(mworkqueue, mdelayed_work);
       4) 创建线程queue并加以名字:mworkqueue = create_singlethread_workqueue("myqueue");
       5) 运行queue:queue_delayed_work(mworkqueue, mdelayed_work, delay_time);
    注:如果要实现循环实行任务,可以在在delayed_work中将delayed_workqueue再次添加到queue中,即在delayed_work中调用queue_delayed_work。

    2.举例分析:
    #include <linux/sched.h>
    #include <linux/init.h>   
    #include <linux/module.h> 
    #include <linux/workqueue.h> 
    #include <linux/proc_fs.h>
    #include <linux/delay.h>   
    #include <linux/interrupt.h>    
    #include <linux/kernel.h> 
    struct delayed_work mdwq;  
    struct workqueue_struct *mwq;  
    void delay_work_func(struct work_struct *work)  
    {  
        int i;  
        printk(KERN_INFO "%s:%d ",__FUNCTION__,__LINE__);  
        for (i = 0; i < 3; i++) {  
            printk(KERN_ERR "%s:i=%d ",__FUNCTION__,i);  
            msleep(3000);  
        }  
    }  
      
    static int __init delay_work_init(void)  
    {  
        int ret;  
        int i;  
        mwq = create_workqueue("my workqueue");  
        if (!mwq) {  
            printk(KERN_ERR "Create workqueue failed! ");  
            return 1;     
        }  
        printk(KERN_INFO "Create workqueue successful! ");  
      
        INIT_DELAYED_WORK(&mdwq, delay_work_func);  
          
        ret = queue_delayed_work(mwq, &mdwq, 3000);  
        printk(KERN_INFO "first ret=%d! ", ret);  
          
        for (i = 0; i < 3; i++) {   
            printk(KERN_INFO "%s:ret=%d,i=%d ",__FUNCTION__,ret, i);  
            msleep(1000);  
        }  
      
        ret = queue_delayed_work(mwq, &mdwq, 0);  
        printk(KERN_INFO "second ret=%d! ", ret);  
      
        return 0;  
    }  
      
    static void __exit delay_work_exit(void)  
    {  
        int ret;  
        ret = cancel_delayed_work(&mdwq);  
        flush_workqueue(mwq);  
        destroy_workqueue(mwq);  
        printk(KERN_INFO "Exit! ret=%d ", ret);  
    }  
    module_init(delay_work_init);  
    module_exit(delay_work_exit);  
    MODULE_LICENSE("GPL"); 
    运行结果:
    kernel: Create workqueue successful!  
    kernel: first ret=1!  
    kernel: delay_work_init:ret=1,i=0  
    kernel: delay_work_init:ret=1,i=1  
    kernel: delay_work_init:ret=1,i=2  
    kernel: second ret=0!  
    kernel: Exit! ret=1  

    从例子可以看出当工作队列还在执行该任务,调用queue_delayed_work()返回1,否则返回0。
    主线程mwq将任务添加到工作队列后,使得工作队列在延迟delay后执行函数delay_work_func(),而mwq线程继续执行;
    转载请注明本文转自如何使用queue_delayed_work函数,谢谢。
  • 相关阅读:
    【Canvas】摆线模拟
    【JS】JS正则表达式常见用法(验证、查找和替换)
    【Canvas】将屏幕坐标系转换成笛卡尔坐标系
    【Canvas】狗撵兔子和贝塞尔曲线
    精妙的SQL和SQL SERVER 与ACCESS、EXCEL的数据导入导出转换
    用Javascript实现HtmlEncode与HtmlDecode的另类方法
    [Javascript] 如何在客户端验证表单被改变
    关于IE6和IE7关闭窗口时提示和不提示以及上传图片前的本地预览解决办法
    项目开发经验谈(一)
    Windows 7 开发新特性
  • 原文地址:https://www.cnblogs.com/zafu/p/7400579.html
Copyright © 2011-2022 走看看