2016-04-21 9 views
1

Ich habe C++ Clr-Projekt. Es verwendet API eine Firma (wie Solidworks 'API).Wie kann ich Ausnahme auslösen, wenn die Verarbeitung keine Antwort

So..Mein Problem ist hier passiert.

BOOL rc = m_pc3dCore->Login(m_CdmUser, m_CdmUserPass, m_CdmServer); 

Das versuchen, die anderen Server-Anwendung anmelden. Aber wenn diese Anwendung nicht funktioniert, gibt es keine Antwort. Ich kann die nächste Quelle nicht weiterbringen. Debuger Bleibt unendlich "m_pc3dCore-> Login (m_CdmUser, m_CdmUserPass, m_CdmServer);"

Also, ich habe das Wrapping zu verwenden versuchen {} catch (...) {} Aber nichts geändert.

Ich möchte Exception werfen, wenn es dort 4 Sekunden bleibt. Kannst du mir beibringen, wie ich dieses oder ein Schlüsselwort für die Suche lösen kann?

--- meine Meinung Ich dachte, dass ich dies mit System :: Thread Interface lösen. Also habe ich versucht, eine Methode zu machen. Die Methode wird unendlich oft ausgeführt.

void threadFuncA() 
{ 
    while(true){ 
    } 
} 

und machen Thema

Thread^ newThread = gcnew Thread(gcnew ThreadStart(threadFuncA)); 
newThread->Start(); 
newThread->Join(); 

Programmstart Unendlich-Schleife nach newThread- genannt> Join(); Ist es Lösung Exit-Schleife?

  • Ich kann nicht versuchen m_pc3dCore- verwenden> Login (m_CdmUser, m_CdmUserPass, m_CdmServer); Da dieser Server jetzt funktioniert, geben Sie True zurück. Infolgedessen kann ich kein Problem passieren. Es ist der Grund, dass ich Endlosschleife-Methode machte.

Vielen Dank!

Antwort

0

Auf einem UNIX-System können Sie einen blockierenden Systemaufruf durch ein Signal unterbrechen. Versuch:

alarm(4); 
BOOL rc = m_pc3dCore->Login(m_CdmUser, m_CdmUserPass, m_CdmServer); 
alarm(0); 

nach 4 Sekunden eine blockierende Situation unterbrochen wird und das Programm geht weiter. zuerst einen selbst geschriebenen Handler (int) für die Diagnose dieser Situation installieren:

signal(SIGALRM, handler); 

oder verwenden sigaction() auf einem modernen UNIX.

+0

Danke ich löste yeaster Tag mit thread.join (int msec). Aber ich denke, dass die Verwendung von Alarm kann auch lösen. – user5949771

0

Wenn der Aufruf an Login() nicht nach einem Timeout selbst zurückkehrt, müssen Sie wahrscheinlich eine Art von Abruf implementieren.

Here ist ein Artikel über Abfragen, Rückrufe und Ereignisse. Und here ist ein Artikel über einige neuere Sprachenfunktionen, die Ihnen helfen können, Ihr Ziel zu erreichen. Hoffentlich weist dich das zumindest in die richtige Richtung.

Verwandte Themen