C 如何在周期性函数调用中只调用一次子函数
我是c的初学者,有一个简单的问题: 我有一个函数myfunction(),它每100毫秒定期调用一次。 在这个函数中,我必须调用另一个函数,但只能在myfunction()的beginn第一次调用时调用一次,但不能定期调用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
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
的一部分!