如何在第三个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;
}
答案 0 :(得分:0)
与UNIX信号不同,timeSetEvent
不会中断线程,回调并行运行,并且longjmp
跨线程是未定义的行为。
关于您的实际问题,这是一个糟糕的想法。这样的堕胎可能使图书馆处于不一致的状态。
相反,尝试让库供应商提供接受超时的API,或者使用另一个已经支持它的库。