回调函数问题

Call Back Function issue

本文关键字:问题 函数 回调      更新时间:2023-10-16

我正在尝试回调函数,我看不出这里出了什么问题。

func1接受两个函数指针,我将指针传递给func2和func3。Func2在打印到cout之前应该等待5秒,func3在打印到cout之前应该等待12秒。wait()函数是我自己实现的,但没有包括在这里。

程序运行时,5秒后,func2和func3同时输出。我本来期望等待5秒让func2打印出来,然后再等待12秒让func3打印出来,但事实并非如此。

有人能看出这里有什么问题吗?提前感谢。

#define ONE_SEC 1000000000/3
void wait(int);
void func1(void(*)(), void(*)());
void func2();
void func3();
int main()
{
    std::cout<<"In Main Program!!"<<std::endl;
    void (*funcPtr2)();
    void (*funcPtr3)();
    funcPtr2 = func2;
    funcPtr3 = func3;

    func1(funcPtr2, funcPtr3);
    return 0;
}
void func1(void (*fptr2)(), void (*fptr3)())
{
    std::cout<<"In function one!!"<<std::endl;
    (*fptr2)();
    (*fptr3)();
}
void func2()
{
     wait(5);
     std::cout<<"In function 2 - callback function!!"<<std::endl;
}
void func3()
{
    wait(20);
    std::cout<<"In function 3 - callback function!!"<<std::endl;
}
void wait (int secs)
{
    long j;
    long i;
    for (i = 0; i < secs * (ONE_SEC); i++)
    {
        j++;
    }
}

既然你重新发明的轮子不工作,试试这个:

#include <iostream>
#include <thread>
#include <chrono>
int main()
{
    std::cout << "yo" << std::endl;
    std::this_thread::sleep_for(std::chrono::seconds(10));
    std::cout << "whats" << std::endl;
    std::this_thread::sleep_for(std::chrono::seconds(5));
    std::cout << "up" << std::endl;
    std::cin.get();
    return 0;
}

如果在windows操作系统上不能设置,请选择Sleep(seconds),否则在unix上执行ussleep

试试这个

#include <iostream>
#include <stdlib.h>
#include <time.h>
 void wait ( int seconds )
 {
    clock_t endwait;
    endwait = clock () + seconds * CLOCKS_PER_SEC ;
    while (clock() < endwait) {}
 }
 void func1(void(*)(), void(*)());
 void func2();
 void func3();
 int main()
 {
    std::cout<<"In Main Program!!"<<std::endl;
    void (*funcPtr2)();
    void (*funcPtr3)();
    funcPtr2 = func2;
    funcPtr3 = func3;

    func1(funcPtr2, funcPtr3);
    return 0;
 }
 void func1(void (*fptr2)(), void (*fptr3)())
 {
    std::cout<<"In function one!!"<<std::endl;
    (*fptr2)();
    (*fptr3)();
 }
 void func2()
 {
    wait(5);
    std::cout<<"In function 2 - callback function!!"<<std::endl;
 }
 void func3()
 {
    wait(20);
    std::cout<<"In function 3 - callback function!!"<<std::endl;
 }

假设您必须实现自己的wait函数,并且不调用更合理的this_thread::sleep_for或针对clock()实现的检查之一,那么下面的代码(您的代码)具有未定义的行为,因为您从未初始化j:

void wait (int secs)
{
    long j;
    long i;
    for (i = 0; i < secs * (ONE_SEC); i++)
    {
        j++;
    }
}

基本类型(int, long, bool, char)需要默认初始化,因为它们没有构造函数(它们不是c++中的实际类)。(当变量存在于文件/命名空间作用域中时,它将被零初始化,但这种情况很少发生)。因此,简单地将j设置为0将摆脱您的未定义行为:

void wait (int secs)
{
    long j = 0;
    long i;
    for (i = 0; i < secs * (ONE_SEC); i++)
    {
        j++;
    }
}

但这有点多余,不是吗?下面的内容不一样吗?

void wait (int secs)
{
    for (size_t i = 0; i < secs * (ONE_SEC); i++)
    {}
}

然而,这样做的问题是,除非ONE_SECsecs是在编译时或运行时根据您的系统确定的,否则几乎无法保证您的程序将等待指定的时间。随着硬件的改进,等待的时间会越来越少。

最后,我想说使用现在标准的this_thread::sleep_for(),就像另一个用户早些时候发布的那样:

#include<thread>
#include<chrono>
// ...
void wait (int secs)
{
    std::this_thread::sleep_for(std::chrono::seconds(secs));
}