Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何在周期性函数调用中只调用一次子函数_C - Fatal编程技术网

C 如何在周期性函数调用中只调用一次子函数

C 如何在周期性函数调用中只调用一次子函数,c,C,我是c的初学者,有一个简单的问题: 我有一个函数myfunction(),它每100毫秒定期调用一次。 在这个函数中,我必须调用另一个函数,但只能在myfunction()的beginn第一次调用时调用一次,但不能定期调用 void myfunction() // function is called periodically every 100 ms { ... mySubfunction(); // this function have to be called only o

我是c的初学者,有一个简单的问题:

我有一个函数myfunction(),它每100毫秒定期调用一次。 在这个函数中,我必须调用另一个函数,但只能在myfunction()的beginn第一次调用时调用一次,但不能定期调用

void myfunction() // function is called periodically every 100 ms
{
    ...
    mySubfunction(); // this function have to be called only once in the  first call of myFunction() and than skipped each time after that.
}   ...

如何在c中实现这一点?

使用
静态
?类似于

void myfunction() // function is called periodically every 100 ms
{
    static int once = 1;
    if (once) {
        mySubfunction(); 
        once = 0;
    }
}  
示例中的变量
once
将只初始化一次,并在调用之间保留其值,因为
static
关键字


请注意多线程环境中的含义,请参阅。

使用
静态
?类似于

void myfunction() // function is called periodically every 100 ms
{
    static int once = 1;
    if (once) {
        mySubfunction(); 
        once = 0;
    }
}  
示例中的变量
once
将只初始化一次,并在调用之间保留其值,因为
static
关键字


请注意多线程环境中的含义,请参阅。

您可以使用

static int flag = 1
void myfunction() // function is called periodically every 100 ms
{
    if(flag)
    {
       mySubfunction(); 
       flag = 0;
    }     
 }   

你可以吃

static int flag = 1
void myfunction() // function is called periodically every 100 ms
{
    if(flag)
    {
       mySubfunction(); 
       flag = 0;
    }     
 }   

关于第一次查看的任务非常简单,可以是下一个代码:

void func()
{
    static LONG first = TRUE;
    if (_InterlockedExchange(&first, FALSE))
    {
        subfunc();
    }
    // some code
}
这样就可以100%地保证
subfunc()
将被调用一次且仅被调用一次,即使多个线程同时调用您的
func()

但如果
//某些代码取决于
子函数的结果,该怎么办?在这种情况下,任务已经变得不平凡了。需要一些同步。这里已经依赖于操作系统或编译器。在Windows中,从Vista开始了解此问题并添加函数-读取
如果
subfunc()
没有输入和输出参数,则代码可以非常简单:

BOOL CALLBACK InitOnceCallback(PINIT_ONCE /*InitOnce*/, PVOID /*Parameter*/,PVOID* /*Context*/)
{
    subfunc();
    return TRUE;
}

void func()
{
    static INIT_ONCE once = RTL_RUN_ONCE_INIT;
    if (InitOnceExecuteOnce(&once, InitOnceCallback, 0, 0))
    {
        // somecode
    }
    // error init
}
此外,一些现代编译器可以正确处理静态一次性初始化。说出最新版本的
CL
。有了它,代码可以是下一个:

void func()
{
    static char tag = (subfunc(), 0);
    // some code
}

这里
CL
内部调用特殊函数(在CRT中实现)
\u Init\u thread\u header
\u Init\u thread\u footer
-实现可以在CRT源代码中查看-
thread\u safe\u statics。cpp
关于第一次查看任务非常简单,可以是下一个代码:

void func()
{
    static LONG first = TRUE;
    if (_InterlockedExchange(&first, FALSE))
    {
        subfunc();
    }
    // some code
}
这样就可以100%地保证
subfunc()
将被调用一次且仅被调用一次,即使多个线程同时调用您的
func()

但如果
//某些代码取决于
子函数的结果,该怎么办?在这种情况下,任务已经变得不平凡了。需要一些同步。这里已经依赖于操作系统或编译器。在Windows中,从Vista开始了解此问题并添加函数-读取
如果
subfunc()
没有输入和输出参数,则代码可以非常简单:

BOOL CALLBACK InitOnceCallback(PINIT_ONCE /*InitOnce*/, PVOID /*Parameter*/,PVOID* /*Context*/)
{
    subfunc();
    return TRUE;
}

void func()
{
    static INIT_ONCE once = RTL_RUN_ONCE_INIT;
    if (InitOnceExecuteOnce(&once, InitOnceCallback, 0, 0))
    {
        // somecode
    }
    // error init
}
此外,一些现代编译器可以正确处理静态一次性初始化。说出最新版本的
CL
。有了它,代码可以是下一个:

void func()
{
    static char tag = (subfunc(), 0);
    // some code
}

这里
CL
内部调用特殊函数(在CRT中实现)
\u Init\u thread\u header
\u Init\u thread\u footer
-可以在CRT源代码中查看实现-
thread\u safe\u statics.cpp
这可能比您想要的更高级,但您可以使用函数指针并更改调用哪个函数

// Function declarations
void mySubfunction(void);
void myNormalfunction(void);

// Function pointer, which can be changed at run time.
static void (*myfunction)(void) = mySubfunction;

void mySubfunction(void)
{
    // Do the sub-function stuff.

    // Change the function pointer to the normal function.
    myfunction = myNormalfunction();

    // Do the normal function stuff (if necessary on the first call).
    myNormalfunction();
}

void myNormalfunction(void)
{
    // Etc.
}

int main(void)
{
    int x;
    for(x = 0; x < 3; x++)
    {
        // Call myfunction as you usually would.
        myfunction();
    }
    return 0;
}
//函数声明
void mySubfunction(void);
void-myNormalfunction(void);
//函数指针,可在运行时更改。
静态void(*myfunction)(void)=mySubfunction;
void mySubfunction(void)
{
//做子功能的事情。
//将函数指针更改为普通函数。
myfunction=myNormalfunction();
//执行正常的函数操作(如果第一次调用时需要)。
myNormalfunction();
}
void mynormal函数(void)
{
//等等。
}
内部主(空)
{
int x;
对于(x=0;x<3;x++)
{
//像往常一样调用myfunction。
myfunction();
}
返回0;
}

这可能比您想要的更高级,但您可以使用函数指针并更改调用哪个函数

// Function declarations
void mySubfunction(void);
void myNormalfunction(void);

// Function pointer, which can be changed at run time.
static void (*myfunction)(void) = mySubfunction;

void mySubfunction(void)
{
    // Do the sub-function stuff.

    // Change the function pointer to the normal function.
    myfunction = myNormalfunction();

    // Do the normal function stuff (if necessary on the first call).
    myNormalfunction();
}

void myNormalfunction(void)
{
    // Etc.
}

int main(void)
{
    int x;
    for(x = 0; x < 3; x++)
    {
        // Call myfunction as you usually would.
        myfunction();
    }
    return 0;
}
//函数声明
void mySubfunction(void);
void-myNormalfunction(void);
//函数指针,可在运行时更改。
静态void(*myfunction)(void)=mySubfunction;
void mySubfunction(void)
{
//做子功能的事情。
//将函数指针更改为普通函数。
myfunction=myNormalfunction();
//执行正常的函数操作(如果第一次调用时需要)。
myNormalfunction();
}
void mynormal函数(void)
{
//等等。
}
内部主(空)
{
int x;
对于(x=0;x<3;x++)
{
//像往常一样调用myfunction。
myfunction();
}
返回0;
}

如果在调用
myfunction
时通常不应该调用
mySubfunction
,那么
mySubfunction
不应该是
myfunction
的一部分!如果调用
myfunction
时通常不应该调用
mySubfunction
,那么
mySubfunction
不应该是
myfunction
的一部分!