2013-08-31 30 views
6

Pracuję nad wielowątkowym projektem C++ systemu Win32 i chciałbym użyć jednej z alternatywnych dla wątku localtime_* dla localtime().localtime_r wsparcie dla MinGW

Niestety muszę użyć kompilatora MinGW, a localtime_s nie może być używany poza materiałem Microsoft.

Problem polega na tym, że ani localtime_r pracuje: powiązany fragment kodu jest

#include <ctime> 

... 

string getCurrentTime() 
{ 
    time_t t; 
    time(&t); 
    struct tm timeinfo; 
    //localtime_s(&timeinfo, &t); 
    localtime_r(&t, &timeinfo); 

    char buf[128]; 
    strftime(buf, 128, "%d-%m-%Y %X", &timeinfo); 

    return string(buf); 
} 

... 

To wyjście kompilatora:

error: 'localtime_r' was not declared in this scope 

Czy wsparcie MinGW localtime_r?

Jeśli nie, istnieje alternatywa bezpieczna dla wątków? (z wyłączeniem boost/QT/etc, których nie mogę użyć).


EDIT: to <time.h> dostarczone przez mojego instalacji MinGW: http://pastebin.com/0CYBfMzg

+1

Co oznacza "' localtime_s' nie mogą być stosowane na zewnątrz Microsoft rzeczy" oznacza? MinGW celuje w msvcrt.dll, a msvcrt.dll definiuje 'localtime_s' (jest wyeksportowany jako' _localtime32_s' i '_localtime64_s', odpowiednio dla 32-bitowych i 64-bitowych' time_t'). Jeśli nie zostanie zadeklarowany przez nagłówki biblioteki MinGW, zadeklaruj go sam i wywołaj. Zobacz nagłówki bibliotek Visual C++ dla ich deklaracji. –

+0

@JamesMcNellis Wiele źródeł mówi, że mogą być używane tylko z kompilatorem microsoft. Próbowałem już (w tym '') i kompilując za pomocą g ++ otrzymuję komunikat 'error: 'localtime_s' nie został zadeklarowany w tym zakresie'. Zobacz na przykład: http://stackoverflow.com/questions/17085603/time-functions-in-mingw/17088374#17088374 – eang

+1

Nie wiem, co to są te "wiele źródeł", ale są one złe. Nie jest to zadeklarowane przez '', jest zadeklarowane przez '' w (starym) pakiecie Visual C++ SDK. Jeśli nie jest to zadeklarowane przez twoją kopię "pliku " MinGW, musisz to zadeklarować samodzielnie. –

Odpowiedz

6

Does MinGW support localtime_r ?

nr

If not, does exist a thread-safe alternative? (excluding boost/QT/etc that I can't use)

MinGW użyje natywnego localtime funkcji w systemie Windows, który jest bezpieczny wątek . (Ale to nie jest reentrant, więc uważaj na to).

+0

Wyjaśnij, w jaki sposób localtime() jest bezpieczne dla wątków? – Keith4G

+0

@ Keith46 używa wewnętrznych zmiennych wątku wewnętrznie. – nos

+0

Ooooh, to fajne. Nie złapałem tego w dokumentacji. Wersje POSIX używają zamiast tego statycznych globali. – Keith4G

-2

Spróbuj użyć funkcji localtime zamiast localtime_r:

time_t t; 
struct tm *timeinfo; 
time(&t); 
timeinfo = localtime(&t); 
printf ("%s", asctime(timeinfo));