Extern "C"-Api-Funktion liefert im Thread keine Werte



  • Hallöle,

    ich habe ein Projekt, in dem ich eine API benutzen muss, die in C verfasst ist. Die Header deklarieren die Funktionen schon richtig als extern "C", so daß ich in meiner Windows Anwendung diese auch benutzen kann. Konkret betitelt habe ich hier die Funktion

    apGetBaseFrame(tID Device, &tFrame outputFrame)
    

    zum weiteren Verständnis:
    tID Device ist Input, tFrame outputFrame ist der output.
    tID ist ein typedef der API auf ein Array char[256]
    tFrame ist ein typedef der API auf ein mehrdimensionales Array float[3][3]

    Meine Anwendung, eine mit VS2003 erstellte Dialogbasierte Anwendung, included die Datei apiCalls.h (von mir), hier sind folgende Funktionen und Variablen von mir definiert:

    tFrame workFrame;
    tID DeviceID;
    bool Abbruchkriterium;
    
    UINT GetFrame(){
      apGetBaseFrame(DeviceID, &workFrame);
    }
    
    UINT GetFrameThread(LPVOID param){
      while(!Abbruchkriterium){
        GetFrame();
      }
    }
    

    (in DeviceID steht durch hier nicht aufgeführte Initialisierung etwas korrektes drin)
    soooooooo
    In meiner Anwendung kann ich nun, da ich ja mittels "#include apiCalls.h" die Datei eingebunden habe, mal testweise mit einem Button die Funktion um das Frame zu kriegen ausführen:

    CMeineApp::GetFrameBtn_clicked(sender usw usf){
      getFrame();
    }
    

    ...fuktioniert, im Array sind die richtigen Werte drin.

    aber wenn ich das Ganze jetzt in einen Thread verpacke(später soll es regelmäßig ausgeführt werden), und zwar so:

    CMeineApp::MakeThreadBtn_clicked(usw usf){
      int i=1;
      AFxBeginThread(GetFrameThread,(LPVOID)i);
    }
    

    ...dann wird die Funktion ohne Fehlermeldung ausgeführt, aber das Ergebnis ist 0 - das Array also im Ausgangszustand.
    Das ist bei allen API Funktionen so, die etwas auslesen: nie kommt etwas zurück. Wenn ich die Funktion nicht aus dem Thread heraus aufrufe, geht es jeweils.

    Hat einer eine Lösung? Ich weiss wohl nicht genug über Threads, kann mir jemand das Problem erklären?

    Danke schonmal...



  • Da musst Du wohl jemand Fragen, der die API für "apGetBaseFrame" geschrieben hat!



  • Okay. Ist das sicher? Ich habe ja gehofft, dass der Fehler bei mir liegt, und ich irgendetwas nicht durchdacht oder beachtet habe... 😕 Was ist denn für den Aufruf der Funktionen der Unterschied, wenn ich sie einmal im Thread und einmal 'direkt' aufrufe? Kontaktieren ist möglich, wir sind ja Kunde, aber ich hätte dazu gern etwas mehr Hintergrund.

    Ne Idee, was ich noch probieren könnte, um das Ganze hinzukriegen, immerhin geht es ja ohne Thread - ich habe nämlich wenig Hoffnung, dass sich am Stats quo der API etwas ändert, sie ist seit langer Zeit nicht mehr weiter entwickelt worden (ist ja auch auf C Basis)


  • Mod

    Ich denke Jochen hat recht!
    Du musst Die mal ansehen wie dieses "Frame" geschrieben ist. Wnen sich dahinter etwa wieder eigene Fenster verstecken, dann hast Du in einem neuen Thread schlechte Karten.
    1. bekommst Du ungewollt evtl. eine synchronisation,
    2. sind CWnd Objekte in der MFC nicht über Threadgrenzen hinweg zu nutzen!



  • ähm... also das Frame ist eine Matrix, symbolisiert Geometrie. Das sind einfach nur float Werte (wie oben beschrieben)

    Die besagte API ist durchgängig nicht objektorientiert und liefert bzw. setzt nur primitive Datentypen wie floats, integers und char-arrays.

    Aber aus Euren Antworten kann ich entnehmen, dass zumindest ich in meinem Aufbau prinzipiell keinen Fehler gemacht habe, richtig?

    EDIT: ich sollte vielleicht zum Verständnis noch sagen, wozu die API gehört: zu einem Simulationsprogramm für Fertigungsroboter. Dieses läuft im Hintergrund, und ich frage mittels der API jetzt bestimmte 3D-Koordinaten (besagtes Frame) ab.



  • Mir kam da noch so eine andere Idee.
    Um mittels der API mit dem Hauptprogramm (das ja hier die Werte liefern soll),
    'verbindet' man über die API Funktion apInit() die eigene Anwendung mit dem Hauptprogramm - ansonsten liefern die Funktionen ebenfalls keine Werte (verbindet oder registriert die eigene Anwendung, was da im Genauen passiert, kann ich aus Ermangelung der Sourcen leider nicht sagen).

    Kann es sein, dass der von mir erzeugte Thread dem Hauptprogramm so erscheint, dass er nicht der Anwendung, aus der heraus initialisiert wurde, angehört (nicht 'verbunden' ist)? Kann man über ein Bestehen dieser Möglichkeit eine Aussage treffen, ohne die Sourcen der API zu kennen? Und fällt jemandem eine Lösung ein (sollte es das sein), oder auch Möglichkeiten, das zu testen?



  • Du musst vermutlich alle Funktionen der LIB nur in Deinem Thread aufrufen. Dann dürfte es gehen!



  • Stimmt, das wäre die Konsequenz. Das werde ich versuchen. Die Möglichkeit besteht - zum Glück - bei meinen Anforderungen.



  • Das hat nicht funktioniert. Hat jemand noch eine Idee?



  • Wende Dich an den Hersteller.


Anmelden zum Antworten