Das Verhalten von std::this_thread::sleep_for mit einer Bibl. Dritter.



  • Hallo allerseits,

    ich habe ein Problem mit einer Pause (sleep) im Code.

    Folgendes: Der Code läuft

    #include <chrono>
    #include <thread>
    
    int
    main()
    {
        std::chrono::seconds duration(3);
        std::this_thread::sleep_for(duration);
    }
    

    Dieser aber nicht. Er wartet NICHT 3 Sekunden sondern läuft glatt durch.

    #include <chrono>
    #include <thread>
    
    #include <PvApi.h>
    
    int
    main()
    {
      PvInitialize();
      std::chrono::seconds duration(3);
      std::this_thread::sleep_for(duration);
    }
    

    Was die PvApi im innern macht, kann ich nicht sagen. Sie ist "closed source". Das einzige was ich an interna habe, ist das PvInitialize() asynchron arbeitet, also Threads.

    Kann mir mit diesen Infos jemand sagen was da nicht funktioniert?

    Besten Dank



  • Compiler?

    Hast du den Source der C++ Standard Library? Wenn ja dann step mal rein.
    Bei Windows könnte ich mir vorstellen dass sleep_for SleepEx mit bAlertable == TRUE verwendet um APCs zu ermöglichen, und PvInitialize einen APC auf den Main-Thread absetzt -- warum auch immer.

    Wobei ich das auch für eher unwahrscheinlich halte.



  • Was sagt denn der Debugger dazu?

    Oder: Welche Hallos gibt folgender Code bei dir aus?

    #include <chrono>
    #include <thread>
    #include <iostream>
    #include <PvApi.h>
    int main()
    {
      std::cout << "Hallo 0" << std::endl;
      PvInitialize();
      std::cout << "Hallo 1" << std::endl;
      std::chrono::seconds duration(3);
      std::cout << "Hallo 2" << std::endl;
      std::this_thread::sleep_for(duration);
      std::cout << "Hallo 3" << std::endl;
    }
    


  • Das OS ist Ubuntu 64 Bit. Der Compiler-Aufruf:

    g++ -std=c++0x -D_x64 -D_LINUX -D_REENTRANT test.cpp -lPvAPI -o test
    

    Dabei sind die defines "-D_x64 -D_LINUX -D_REENTRANT" für die PvApi-Lib.

    Die Ausgabe des "Hallo"-Codes:

    ./test
    Hallo 0
    Hallo 1
    Hallo 2
    Hallo 3
    

    wobei auch der Code glatt duchläuft.



  • Unter Windows verhaelt sich das Programm wie erwartet, d.h. es wartet vor der Ausgabe "Hallo 3". Ein Linuxsystem habe ich gerade nicht nicht zur Hand.



  • Ja, vielen Dank für die Mühe. "Traurig" zu hören das es wohl nur unter Linux so zickig ist.


  • Mod

    knivil schrieb:

    Unter Windows verhaelt sich das Programm wie erwartet, d.h. es wartet vor der Ausgabe "Hallo 3". Ein Linuxsystem habe ich gerade nicht nicht zur Hand.

    Hast du diese fragliche API auch benutzt? Denn ohne diese funktioniert das Programm natülrich auch in Linux wie erwartet. Mit kann ich nicht testen, da ich sie nicht habe.



  • Ja, ist die KameraApi von Allied Vision Technologie (GigESDK, also Ethernet, ohne angeschlossener Kamera getestet). Version ist 1.26, habe eine 32Bit Applikation gebaut. Betriebssystem ist Windows 7, Kompiler VS2012.


Anmelden zum Antworten