Thread starten in eVC4



  • Hallo Leute,

    nachdem ich Google nun schon seit Tagen ohne Ergebnis strapaziert habe, versuche ich es heute mal mit einer (offenbar sehr speziellen) Anfrage an die Community.

    Wir benutzen in meiner Firma eine selbst entwickelte Anwendung für mobile Endgeräte, die per http-Request auf ein SAP-System zugreift. Da die Kollegen während der Arbeit mit ihren Handhelds zwischen den Access-Points herumlaufen, passiert es gelegentlich, dass während der serverseitigen Verarbeitung die Verbindung abbricht, so dass keine Antwort mehr eingeht und die Client-Anwendung im Wartezustand verbleibt. Unser (einziger) MFC-Spezialist ist seit Wochen krank, aber das Thema kocht aktuell hoch bis in die Chefetage. Da ich das Pech habe, hin und wieder kleine Erweiterungen im Client vorgenommen zu haben (jedoch im reinen im Front-End), wurde ich nun mit der Lösung dieses Problems beauftragt, obwohl ich als ABAP-Entwickler von den tiefer liegenden C++Funktionen eigentlich gar keine Ahnung habe…

    Meine Idee wäre, den Request asynchron aufzurufen und innerhalb einer vorgegebenen Zeit den Eingang einer Antwort zu prüfen, bevor die Anwendung nach Ausgabe einer Timeout-Meldung wieder freigegeben wird. Wie das quellcodemäßig funktionieren sollte, konnte ich relativ schnell herausfinden, also wollte ich erst mal ein Testprogramm schreiben. Leider gibt es schon mit dem allerersten Include

    #include <boost/thread.hpp>
    

    ein Problem, und zwar meldet der Compiler folgendes:

    [...]\boost\date_time\c_time.hpp(17) : fatal error C1083: Cannot open include file: 'ctime': No such file or directory

    Eine Suche über das ganze Laufwerk ergab, dass es im Verzeichnis […]\boost\compatibility\cpp_c_headers tatsächlich eine Datei namens "ctime" gibt, also habe ich das Include in c_time.hpp mal so

    //old: #include <ctime>
    #include <boost\compatibility\cpp_c_headers\ctime>  //new
    

    abgeändert, was zu weiteren Fehlern führte:

    […]\boost\compatibility\cpp_c_headers\ctime(12) : error C2039: 'clock_t' : is not a member of 'global namespace'' […]\\boost\\compatibility\\cpp\_c\_headers\\ctime(12) : error C2873: 'clock_t' : symbol cannot be used in a using-declaration […]\\boost\\compatibility\\cpp\_c\_headers\\ctime(15) : error C2039: 'asctime' : is not a member of 'global namespace''
    […]\boost\compatibility\cpp_c_headers\ctime(15) : error C2873: 'asctime' : symbol cannot be used in a using-declaration
    […]\boost\compatibility\cpp_c_headers\ctime(16) : error C2039: 'clock' : is not a member of 'global namespace'' […]\\boost\\compatibility\\cpp\_c\_headers\\ctime(16) : error C2873: 'clock' : symbol cannot be used in a using-declaration […]\\boost\\compatibility\\cpp\_c\_headers\\ctime(18) : error C2039: 'localtime' : is not a member of 'global namespace''
    […]\boost\compatibility\cpp_c_headers\ctime(18) : error C2873: 'localtime' : symbol cannot be used in a using-declaration
    […]\boost\compatibility\cpp_c_headers\ctime(19) : error C2039: 'strftime' : is not a member of 'global namespace'' […]\\boost\\compatibility\\cpp\_c\_headers\\ctime(19) : error C2873: 'strftime' : symbol cannot be used in a using-declaration […]\\boost\\compatibility\\cpp\_c\_headers\\ctime(20) : error C2039: 'ctime' : is not a member of 'global namespace''
    […]\boost\compatibility\cpp_c_headers\ctime(20) : error C2873: 'ctime' : symbol cannot be used in a using-declaration
    […]\boost\compatibility\cpp_c_headers\ctime(21) : error C2039: 'gmtime' : is not a member of 'global namespace'' […]\\boost\\compatibility\\cpp\_c\_headers\\ctime(21) : error C2873: 'gmtime' : symbol cannot be used in a using-declaration […]\\boost\\compatibility\\cpp\_c\_headers\\ctime(22) : error C2039: 'mktime' : is not a member of 'global namespace''
    […]\boost\compatibility\cpp_c_headers\ctime(22) : error C2873: 'mktime' : symbol cannot be used in a using-declaration
    […]\boost\compatibility\cpp_c_headers\ctime(23) : error C2039: 'time' : is not a member of 'global namespace'' […]\\boost\\compatibility\\cpp\_c\_headers\\ctime(23) : error C2873: 'time' : symbol cannot be used in a using-declaration […]\\boost\\date\_time\\c\_time.hpp(26) : error C2039: 'time' : is not a member of 'global namespace''
    […]\boost\date_time\c_time.hpp(26) : error C2873: 'time' : symbol cannot be used in a using-declaration
    […]\boost\date_time\c_time.hpp(26) : error C2039: 'localtime' : is not a member of 'global namespace'' […]\\boost\\date\_time\\c\_time.hpp(26) : error C2873: 'localtime' : symbol cannot be used in a using-declaration […]\\boost\\date\_time\\c\_time.hpp(27) : error C2039: 'gmtime' : is not a member of 'global namespace''
    […]\boost\date_time\c_time.hpp(27) : error C2873: 'gmtime' : symbol cannot be used in a using-declaration
    […]\boost\date_time\time_clock.hpp(80) : fatal error C1506: unrecoverable block scoping error

    Ich bin hier völlig ratlos, weil ich mit der Materie noch nichts zu tun hatte. Wir verwenden eVC++4.0 SP2 und Boost 1.38.0, was auch so bleiben soll. Was kann ich tun, um hier Abhilfe zu schaffen? Kann man die Bibliothek "ctime" vielleicht irgendwo in einer mit eVC4 kompatiblen Version runterladen (gefunden habe ich dazu bisher leider nichts)? Oder habt Ihr vielleicht einen gänzlich anderen Lösungsansatz für mich, der ohne die Boost-Bibliothek auskommt?

    Beste Grüße
    as_gkw



  • unter Windows CE bzw. eVC gibt es meines Wissens die time.h nicht.
    Hatten deswegen auch schon öfters Ärger.

    Vergiss boost, das funktioniert bei diesem Dreckscompiler von Microsoft ohnehin nicht vernünftig (außer so Dinge wie Smart Pointer). Verwende möglichst nur die WinAPI Funktionen, also wenn du einen Thread starten willst sieh dir z.B. CreateThread an.



  • Nicht besser _beginthreadex - wegen CRT Initialisierung etc.?



  • hustbaer schrieb:

    Nicht besser _beginthreadex - wegen CRT Initialisierung etc.?

    hab jetzt den Code nicht vorliegen, durchaus möglich, dass die von dir genannte Version besser ist.
    Jedenfalls sollte er/sie sich auf die WinAPI beschränken, dann kann man auch mit evc einigermaßen passabel arbeiten.



  • Danke Euch beiden erst mal für die Anregungen! Bin übrigens ein "er" 😉

    _beginthreadex kennt unser Compiler leider gar nicht, also hab ich mein Augenmerk auf CreateThread gelegt. Folgende Zeilen hab ich testweise in meinen Quellcode zusätzlich eingefügt:

    ...
      HANDLE hThread;
      LPVOID lpParam;
      hThread = CreateThread(NULL,0,ThreadRequest,lpParam,0,NULL);
    ...
    
    DWORD WINAPI CSapSystem::ThreadRequest(LPVOID lpParam)
    {
      return 0;
    }
    

    Dabei erhalte ich aber immer diesen Fehler:

    error C2664: 'CreateThread' : cannot convert parameter 3 from 'unsigned long (void *)' to 'unsigned long (__cdecl *)(void *)'

    Hab es eigentlich genau so gemacht wie in diversen Beispielen, die ich im Web gefunden habe. Ist wahrscheinlich was saublödes, aber ich steh leider komplett auf dem Schlauch. Was mache ich hier falsch?

    Gruß
    as_gkw



  • probiers testweise mal mit der Funktion foo:

    unsigned long __cdecl foo(void* ptr)
    {
       return 0;
    }
    
    // ...
    
    CreateThread(..., foo,...);
    


  • Microsoft Dreck schrieb:

    hustbaer schrieb:

    Nicht besser _beginthreadex - wegen CRT Initialisierung etc.?

    hab jetzt den Code nicht vorliegen, durchaus möglich, dass die von dir genannte Version besser ist.
    Jedenfalls sollte er/sie sich auf die WinAPI beschränken, dann kann man auch mit evc einigermaßen passabel arbeiten.

    _beginthreadex wäre MSVC Runtime Library, also nicht WinAPI. Aber ich verstehe was du meinst. Kein Thirdparty Zeugs ala Boost. Weil Boost vermutlich nie wirklich eVC unterstützt hat, und die meisten anderen Thirdparty Libs wohl auch nicht.



  • probiers testweise mal mit der Funktion foo:

    unsigned long __cdecl foo(void* ptr)
    {
       return 0;
    }
    
    // ...
    
    CreateThread(..., foo,...);
    

    Nein, bringt leider nichts. Immer noch der gleiche Fehler beim Compilieren...



  • Hi,

    Reinstall:
    eVC++
    und das Smartphone SDK der passenden Version.

    CreateThread ist dort ganz normal erreichbar.

    http://www.microsoft.com/en-us/download/details.aspx?id=16584

    http://geekswithblogs.net/BruceEitman/archive/2009/01/21/windows-ce-threads.aspx

    Schau mal wo das Include und die lib ist, ob alles auf das installierte Plattform SDK zeigt, das die ToolChain richtig eingestellt ist.

    Du brauchst nicht dauernd testen ob der Server da ist, ggf. das Speichern mit einem Event zb OnTimer auslösen. Das Timeout kannst Du auch kürzen.

    Richtige Proghrammierer sind nie krank, sie wurden so geboren, schmeiß ihn raus.

    Grüße K



  • Danke auch Dir für Deinen Tipp! Ich werde aber erst nächste Woche dazukommen, es mal auszuprobieren. Jetzt ist erst mal hitzefrei 🙂

    Schönes Wochenende!



  • Auch das hat leider keinerlei Wirkung. Seltsam finde ich allerdings, dass mir das neue SDK im Konfigurationsmenü überhaupt nicht zur Auswahl angeboten wird, obwohl während der Installation keine Fehler aufgetreten sind.
    ToolChain 😕 Keine Ahnung was das ist... Ich hatte ja noch nicht mal ne Grundschulung in eVC, ein paar Sachen im Workshop kurz gezeigt, Dialogentwicklung krieg ich damit auch hin. Aber im Backend versteh ich wirklich nur Bahnhof. Ich werde das Problem wohl aussitzen müssen und hoffen, dass der Kollege irgendwann wieder auftaucht 😞
    Trotzdem Danke für Euren Einsatz, nur leider sprechen wir wohl verschiedene Sprachen.


Anmelden zum Antworten