gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 20:35:39 27 4
gpt4 key购买 nike

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

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

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

1.使用闹钟功能,但它只能在Linux中使用,即使我使用MinGW标准GCC编译器,我也无法在Windows中使用它。

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

最佳答案

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

关于您的实际问题,这是一个主意。这样的失败可能会使图书馆处于不一致的状态。

相反,请尝试让库供应商提供接受超时的 API,或使用其他已经支持它的库。

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com