2015-07-21 27 views
-3

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

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++; 
    } 

} 
+6

* *我们可能已经找到了问题,然后。 – jrok

+2

您的程序等待执行某些功能的时间有多长,但您没有显示负责*等待的代码。你看到这个问题吗? –

+0

我已经包含wait()代码 – Engineer999

回答

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; 
} 

如果你不能,你是在Windows上,睡眠时间(秒)在UNIX上其他usleep

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; 
} 
0

假设你要实现自己的wait功能,而不是CA灌装更合理this_thread::sleep_for或支票的一个反对clock()实现,则下面的代码(代码)已未定义的行为,因为你永远不初始化j

void wait (int secs) 
{ 
    long j; 
    long i; 

    for (i = 0; i < secs * (ONE_SEC); i++) 
    { 
     j++; 
    } 
} 

原始类型(intlongboolchar)需要被默认初始化,因为它们没有构造函数(它们不是C++中的实际类)。 (当变量存在于文件/名称空间作用域时,它将被初始化为0,但很少出现这种情况)。所以,简单地设置j0将摆脱你的未定义行为的:

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()another user posted earlier:“我已经实现了自己,但这里不包括等待()函数”

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

谢谢。我已经使用了Windows函数Sleep(),而且行为与预期的相同。我仍然不明白为什么我的功能无法正常工作。我期望ONE_SEC和sec应该是整个程序中的正确值。 – Engineer999

+0

问题是你的编译器会优化那个循环。展开它,甚至可以完全删除它,因为它是空的。你不能依靠计数循环来消耗一定的时间 – AndyG