2016-07-30 6 views
-2

Wie kann ich die Timeout-Ausnahme in einer dritten dll Funktion fangen, ich c Sprache in Windows verwendenWie kann ich die Timeout-Ausnahme in einer dritten dll Funktion fangen, verwende ich c Sprache in Windows

ich fangen wollen ein Timeout Ausnahme beim Aufruf einer dritten DLL-Funktion, wissen Sie, dass die Funktion eine lange Zeit braucht, und ich brauche einen Wert in begrenzter Zeit, wenn es nicht in der Zeit zurückgibt, gebe ich ihm einen Standardwert.

Ich muss so viele Informationen suchen, aber es funktioniert nicht. Ich erhalte die zwei Punkte:

1.use die Alarm Funktion, aber es nur in Linux arbeitet, kann ich es nicht in Windows verwenden, selbst verwende ich die MinGW standartisierten GCC Compiler.

2.use der TimeSetEvent Funktion und der setjmp/longjmp Funktion in die drei Funktion vielleicht so geschlossen, es zu nehmen work.but ich sie verwenden, um die programe Dump verursacht, erscheint Fenster ein DialogMessage etwas sagen falsch .

ich den Code und das Bild wie folgt geben:

`

#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

Antwort

0

Im Gegensatz zu UNIX Signale, timeSetEvent nicht unterbricht einen Thread, läuft der Rückruf in Parallel und longjmp über Threads ist undefiniertes Verhalten.

In Bezug auf Ihre eigentliche Frage ist dies eine schlechte Idee. Eine solche Abtreibung könnte die Bibliothek in einem inkonsistenten Zustand hinterlassen.

Versuchen Sie stattdessen, den Bibliotheksanbieter dazu zu bringen, eine API anzubieten, die eine Zeitüberschreitung akzeptiert, oder verwenden Sie eine andere Bibliothek, die diese bereits unterstützt.

+0

Wie wäre es mit: '' 'HANDLE longTimeFunctionHandle = CreateThread (NULL, 0, longTimeFunction, NULL, 0, NULL); WaitForSingleObject (longTimeFunctionHandle, 200); '' ' – newflypig

+0

@newflypig [Bitte lesen] (http://stackoverflow.com/questions/4149146/why-and-when-shouldnt-i-kill-a-thread/4149210#4149210). Wenn es wirklich keinen Weg gibt, 'TerminateThread' zu nennen, zerlegen Sie die Funktion und prüfen Sie, ob der Abbruch sicher ist. Was macht die Funktion? – a3f

+0

Die Funktion versuchen, eine Verbindung zu einer CNC-Maschine mit Ethernet herzustellen. – newflypig

Verwandte Themen