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

我想在调用第三个dll函数时捕获超时异常,您知道该函数需要花费很长时间,并且我需要在有限的时间内返回一个值,如果该时间未返回,则将其设置为默认值值。

我必须寻找太多有关的信息,但这是行不通的。
我有两点:

1.在中使用警报功能,但仅在Linux中有效,即使使用MinGW标准的GCC编译器也无法在Windows中使用。

2.使用timeSetEvent函数和setjmp / longjmp函数,这三个函数可能是如此关闭以使其正常工作。但是我使用它们导致程序转储,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;
}


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

最佳答案

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

关于您的实际问题,这是一个坏主意。这样的流产可能会使磁带库处于不一致状态。

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

关于c - 如何在第三个dll函数中捕获超时异常,我在Windows中使用C语言,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38670690/

10-11 08:15
查看更多