Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Curl, pętla i thread

Ostatnio zmodyfikowano 2016-11-24 22:31
Autor Wiadomość
MSSC
Temat założony przez niniejszego użytkownika
Curl, pętla i thread
» 2016-11-24 21:30:54
Witam

Otóż naskrobałem mały programik, tworzy on 2 thread'y i w jednym pobiera plik html i wyświetla ją (curl) a drugi w tym samym czasie wypisuje w pętli tekst. Moja pętla główna wygląda następująco:

while (1 == 1) {

tekst.join();
curl.join();

...
                Wypisywanie bzdur
                ...

                Sleep(1000);
system("cls");
}

I problem z tym programem jest taki, że pętla wykonuje się raz, po czym wywala błąd "Unhandled exception at 0x74A9A6F2 in Consolmium.exe: Microsoft C++ exception: std::system_error at memory location 0x008FF890.". Używając debuggera doszedłem do tego, że wywalenie występuje w momencie dojścia do tekst.join(); w drugim obiegu pętli, a po wyrzuceniu go z kodu wywala w tym samym momencie przy curl.join();. Logika podpowiada mi, że coś nie tak jest z threadsami, ale detach(); nie pomaga. Pomocy?
P-154093
Monika90
» 2016-11-24 21:53:15
join można wywołać tylko raz dla danego wątku, wywoływanie join w pętli nie ma sensu.
P-154095
MSSC
Temat założony przez niniejszego użytkownika
» 2016-11-24 21:55:45
Już do tego szczerze doszedłem ;). Pojawił się z kolei inny problem, jak pod koniec pętli zniszczyć te wątki, by je potem znów bez problemów zainicjować?
P-154096
Monika90
» 2016-11-24 22:16:55
Programowanie wielowątkowe jest bardzo trudne, wątków należy unikać jak wody święconej. Jeżeli naprawdę nie masz wyboru i musisz użyć wątków, to nie zabieraj się do tego nie przeczytawszy najpierw książki, np. "C++ Concurrency in Action" Anthony'ego Williamsa.

P-154097
MSSC
Temat założony przez niniejszego użytkownika
» 2016-11-24 22:21:13
Bardzo chętnie, ale na razie chyba muszę sobie poradzić bez niej...

Znalazłem dekonstruktor, jest to ~thread(); ale VS2015 wywala błąd przy tyldzie...
P-154098
Monika90
» 2016-11-24 22:31:24
Po powrocie z join można na nowo zainicjować obiekt thread, np.:
C/C++
int main()
{
    std::thread t( func ); //tworzymy wątek
   
    //teraz wątek sobie działa
   
    t.join(); //czekamy aż się skończy
   
    //OK, skończył się
   
    t = std::thread( func ); //tworzymy nowy
    t.join(); //czekamy aż się skończy
}
P-154101
« 1 »
  Strona 1 z 1