如何在第三个dll函数中捕获超时异常,我在Windows中使用c语言

时间:2016-07-30 05:37:40

标签: c windows

如何在第三个dll函数中捕获超时异常,我在Windows中使用c语言

我想在调用第三个dll函数时捕获超时异常,你知道函数需要很长时间,我需要它在有限的时间内返回一个值,如果它没有在时间返回,我会给它是一个默认值。

我必须寻找这么多信息,但它不起作用。 我得到了两点:

1.使用警告功能,但它只适用于Linux,我甚至不能在Windows中使用它,即使我使用的是MinGW标准GCC编译器。

2.使用 timeSetEvent 函数和 setjmp / longjmp 函数,三个函数可能已关闭以使其工作。但我使用它们导致程序dump,windows弹出一个DialogMessage说错了。

我给出的代码和图片如下:

`

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

` enter image description here

1 个答案:

答案 0 :(得分:0)

与UNIX信号不同,timeSetEvent不会中断线程,回调并行运行,并且longjmp跨线程是未定义的行为。

关于您的实际问题,这是一个糟糕的想法。这样的堕胎可能使图书馆处于不一致的状态。

相反,尝试让库供应商提供接受超时的API,或者使用另一个已经支持它的库。