程序猿丁丁 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 虚拟机打包apk出现错误
  • ¥30 最小化遗憾贪心算法上界
  • ¥15 用visual studi code完成html页面
  • ¥15 聚类分析或者python进行数据分析
  • ¥15 逻辑谓词和消解原理的运用
  • ¥15 三菱伺服电机按启动按钮有使能但不动作
  • ¥15 js,页面2返回页面1时定位进入的设备
  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝