如何在第三个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;
}
`
最佳答案
与UNIX信号不同,timeSetEvent
不会中断线程,回调并行运行,并且longjmp
跨线程是未定义的行为。
关于您的实际问题,这是一个坏主意。这样的流产可能会使磁带库处于不一致状态。
相反,请尝试让库供应商提供接受超时的API,或使用已经支持该超时的另一个库。
关于c - 如何在第三个dll函数中捕获超时异常,我在Windows中使用C语言,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38670690/