Russian Qt Forum

Qt => Работа с сетью => Тема начата: orlangur от Июнь 13, 2010, 23:28



Название: QThread::exec, вызов event loop из разных потоков
Отправлено: orlangur от Июнь 13, 2010, 23:28
Доброго времени суток!
Вопрос возник по поводу потоков в Qt.

В одном проекте пользовался asio для асинхронной работы с сетевыми соединениями в режиме сервера.
Обрабатывалось некоторое количество одновременных таких соединений.
Использовалось несколько потоков для выполнения метода run объекта ioservice и обратные вызовы могли выполняться из любого из них, и в результате несколько соединений могли обрабатываться одновременно.

Вопрос закючается в следующем: можно ли подобное делать в Qt, если я, скажем, через QNetworkAccessManager выполняю несколько параллельных запросов (которые обрабатываться так же могут параллельно) к разным ресурсам? Может вызвать QThread::exec для одного и того же QThread объекта из фактически разных потоков...? или есть другие пути?


Название: Re: QThread::exec, вызов event loop из разных потоков
Отправлено: niXman от Июнь 14, 2010, 01:05
вряд ли в кют можно что-то подобное сделать.

UP.
о какой технологичный говнокод получился :o -
Код
C++ (Qt)
int main(int argv, const char** argc) {
  bool run_ = true;
  std::string from = "infile.iso";
  std::string to = "outfile.iso";
 
  {
     std::shared_ptr<std::thread> thp(
           new std::thread(std::bind(
                    [&run_](std::string from, std::string to) {
                       std::ifstream in(from, std::ios::in|std::ios::binary);
                       std::ofstream out(to, std::ios::out|std::ios::trunc|std::ios::binary);
                       std::array<char, 1024*32> buf;
                       while ( run_ ) {
                          std::size_t rd = in.read(buf.data(), buf.size()).gcount();
                          out.write(buf.data(), rd);
                       }
                    },from,to
                 )
           ),
           [](std::thread* th) {
              th->join();
              delete th;
           }
     );
 
     std::cout << "thread started\npress enter for terminate" << std::endl;
     std::cin.get();
     std::cin.clear();
     run_ = false;
  }
  std::cout << "thread terminated\npress enter for exit" << std::endl;
  std::cin.get();
 
  return 0;
}
 
 


Название: Re: QThread::exec, вызов event loop из разных потоков
Отправлено: orlangur от Июнь 14, 2010, 13:33
вряд ли в кют можно что-то подобное сделать.

UP.
о какой технологичный говнокод получился :o -

Фига-се... это по C++1X (почти)стандарту?

только я смысла примера не понял, применительно к вопросу...


Название: Re: QThread::exec, вызов event loop из разных потоков
Отправлено: niXman от Июнь 14, 2010, 13:37
Цитировать
это по C++1X (почти)стандарту?
с++0х
это рабочий пример. немного обфускаблен(или как это слово сказать?), намеренно :)
Цитировать
только я смысла примера не понял, применительно к вопросу...
копирует файл в отдельном потоке. сам освобождает ресурсы и завершает поток при выходе из области видимости.

повторяюсь: код абсолютно рабочий. но реально применять его не советую. есть более правильные решения :)


Название: Re: QThread::exec, вызов event loop из разных потоков
Отправлено: orlangur от Июнь 14, 2010, 13:45
Цитировать
с++0х
Нынче уже 10-й год, а стандарт все еще не стандарт :), так что наверное все же C++1X

Цитировать
копирует файл в отдельном потоке. сам освобождает ресурсы и завершает поток при выходе из области видимости.

эм... суть вопроса была в том: можно ли организовать выполнение цикла обработки сообщений (одного и того же) из разных потоков (по аналогии с boost::asio ioservice'овским методом run), чтобы была возможность параллельно обрабатывать те же сетевые запросы через QNetworkAccessManager.


Название: Re: QThread::exec, вызов event loop из разных потоков
Отправлено: niXman от Июнь 14, 2010, 14:25
ой, епс ;D
я не туда запостил ::)
это имел ввиду: http://www.prog.org.ru/topic_13964_0.html

по поводу boost::asio::io_service согласен. но не уверен что получится заставить QNetworkAccessManager обрабатывать свои соощения в нескольких потоках.