程序猿丁丁 2016-07-30 03:27 采纳率: 0%
浏览 2347

C语言中,对一段函数进行超时判断,请问怎么实现?

windows下的C语言编程,需要对一段第三方dll中的函数进行超时控制,参考了很多种技术都没实现,请问该如何解决。
先说说我想到的东西:
1.中的alarm,这玩意儿在Linux下有效,在Windows中无法使用,即使我用的MinGW标准gcc编译器。
2.中的timeSetEvent,配合中的setjmp和longjmp,这个是最接近的,可惜运行到超时时中断是中断了,可是一直会弹窗报错,不知道为什么。
我在下面的评论中把第二个思路的代码贴出来,再截一个弹窗报警的图。
请教C语言和Win32API高手帮忙看看。

 作者:丁丁
链接:https://www.zhihu.com/question/49052307/answer/113997254
来源:知乎
著作权归作者所有,转载请联系作者获得授权。

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <setjmp.h>

jmp_buf j;

/**
 * 时间中断函数
 */
void PASCAL OneMilliSecondProc(UINT wTimerID, UINT msg, DWORD dwUser, DWORD dwl, DWORD dw2) {
    printf("Timout!\n");
    longjmp(j,1);
}

int longTimeFunction(){
    while (1) {
        printf("operating...\n");
        Sleep(1000);
    }

    return 0;
}


int main(){
    HANDLE hHandle;

    UINT wTimerRes_1ms;//定义时间间隔
    UINT wAccuracy; //定义分辨率
    UINT TimerID_1ms; //定义定时器句柄
    wTimerRes_1ms = 5000;
    if((TimerID_1ms = timeSetEvent(
                          wTimerRes_1ms,
                          wAccuracy,
                          (LPTIMECALLBACK)OneMilliSecondProc, // 回调函数
                          (DWORD)(1), // 用户传送到回调函数的数据;
                          TIME_PERIODIC//周期调用定时处理函数
                      )) == 0) {
        printf("start!!!!!!!!!!!\n");
    } else {
        printf("end!!!!!!!!!!!\n");
    }

    int temp = 0;
    if(setjmp(j) == 0){
        temp = longTimeFunction();
    }else{
        printf("xxxxxx...\n");
        temp = -1;
    }

    printf("%d\n", temp);

    return 0;
}

图片说明

  • 写回答

2条回答 默认 最新

  • 鱼弦 全栈领域优质创作者 2016-07-30 03:48
    关注

    在win32里,可以使用SetTimer很方便,也可以自己封装一个定时器类做处理
    可参考:http://blog.csdn.net/nancy_m/article/details/8542165

    评论

报告相同问题?

悬赏问题

  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置