clock() jednocześnie z cin'em

0

Temat jest enigmatyczny i niejednoznaczny. Wiem. Postaram się to przybliżyć.

Poszukuję możliwości (w miarę strawnej dla moich możliwości) jednoczesnego odliczania upłyniętego czasu z funkcji clock() oraz strumieniem cin.
Przykładem się wspomagając: masz ograniczony czas na wpisanie danych do strumienia. Potem strumień się blokujem czyści i kod idzie dalej.

Bo wiecie, że jakkolwiek się do tego zabierałem, cin blokuje wykonywanie do czasu otrzymania czegokolwiek i pętla... powiedzmy taka:

clock_t endwait;
endwait = clock() + seconds * CLOCKS_PER_SEC ;
while (clock() < endwait) {
    // tutaj cin itp
}

nie wchodzi w rachubę.
please help! :)

0

Odliczaj czas w innym wątku.

0

Wątek, jest to jednostka wykonawcza w obrębie jednego procesu, będąca kolejnym ciągiem instrukcji wykonywanym w obrębie tych samych danych (w tej samej przestrzeni adresowej).

Czyli formule? Hmm... kurcze mało mi to pomogło. Jeśli mógłbyś trochę jaśniej.

user image

0

O Boże, tylko nie CreateProcess - brzydzę się tej funkcji odkąd pół roku temu miałem "przyjemność" go używać i zobaczyć te abstrakcyjne dla mnie, okienkowe parametry.

Nie gardzę twoją pomocą, wręcz dziękuję, tylko potrzebuję czegoś bardziej łopatologicznego i konkretniej w moim kierunku.

P.S Nie manipuluję tu na gotowce! ;P nie, nie. Nie odbierzcie mnie źle, proszę.


EDIT:

NIECO do mnie to dotarło ale tylko za sprawą tego:

#include <pthread.h>

Ktoś by to rozwinął?

Czyżby chodzi o to że to includuję i potem w mainie odpalam ile chcę na raz wątków tym:?

pthread_t threads[NUM_THREADS];
0

Od razu uprzedzam, że podany przeze mnie kod nie będzie "najwyższych lotów". (Teraz na głowie mam SVBRy itp cosie) ;p
Zakładam, że działasz na Windowsie.

#include <iostream>
#include <future>
#include <thread>
#include <chrono>
#include <conio.h>

int main() {
  std::string input;
  std::future<void> w = std::async(std::launch::async, [&](){
   while(true) { 
     if(_kbhit()) {
       char c =_getch();
       input += c;
       std::cout << c;
       std::cout.flush();
     }
   }
  });

  std::_Future_status status;
  status = w.wait_for(std::chrono::seconds(5));
  std::cout << "\nTimes up!\n" << std::endl;

  std::cout << "You typed: " << input << std::endl;
  return 0;
} 
0

Dziwne, postanowiłem powtórzyć kod od @Satirev tylko że bez conio:

#include <future>
#include <thread>
#include <chrono>
#include <sstream>
#include <iostream>
 
int main()
  {
   std::ostringstream input;
   std::future<void> w=std::async(std::launch::async, [&](){ while(std::cin) input<<(char)std::cin.get(); }); 
   auto status=w.wait_for(std::chrono::milliseconds(3000));
   std::cout<<"Times up!"<<std::endl; 
   std::cout<<"You typed: \""<<input.str()<<"\""<<std::endl;
   return 0;
  }

http://ideone.com/IJsyBM
I nie mam zielonego pojęcia czemu to nie chce działać. Pętla while(std::cin) kończy się natychmiast.

0

Pewnie dlatego, że to co chcesz pobrać ze strumienia jest już w argv. Chociaż mogę się mylić.

#include <future>
#include <thread>
#include <chrono>
#include <sstream>
#include <iostream>

int main(int argc, char** argv)
{
   std::ostringstream input;
   std::future<void> w=std::async(std::launch::async, [&](){  
		int current_arg = 1;
		while (current_arg < argc) {
			std::string s = argv[current_arg++];
			input << s << " ";
		}
   }); 
   auto status=w.wait_for(std::chrono::milliseconds(3000));
   std::cout<<"Times up!"<<std::endl; 
   std::cout<<"You typed: \""<<input.str()<<"\""<<std::endl;
	return 0;
} 

W każdym razie na Ideone nadal nie działa, tym niemniej w Visual Studio 2012 działa.

1 użytkowników online, w tym zalogowanych: 0, gości: 1