我正在尝试回调功能,我看不出这里出了什么问题。
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++;
}
}
答案 0 :(得分:1)
由于你重新发明轮子不起作用,试试这个:
#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;
}
如果你不能和你在窗户上,那就去睡觉吧(秒)或者在unix上睡觉吧
答案 1 :(得分:1)
试试这个
#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;
}
答案 2 :(得分:0)
假设您必须实现自己的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_SEC
和secs
在编译时或运行时确定,具体取决于您的系统,否则几乎不能保证您的程序会等待指定的时间。随着硬件的改进,您将等待的时间越来越少。
最终,我会说要使用现在标准的this_thread::sleep_for()
another user posted earlier:
#include<thread>
#include<chrono>
// ...
void wait (int secs)
{
std::this_thread::sleep_for(std::chrono::seconds(secs));
}