Russian Qt Forum
Ноябрь 23, 2024, 23:02 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QThread::exec, вызов event loop из разных потоков  (Прочитано 5201 раз)
orlangur
Гость
« : Июнь 13, 2010, 23:28 »

Доброго времени суток!
Вопрос возник по поводу потоков в Qt.

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

Вопрос закючается в следующем: можно ли подобное делать в Qt, если я, скажем, через QNetworkAccessManager выполняю несколько параллельных запросов (которые обрабатываться так же могут параллельно) к разным ресурсам? Может вызвать QThread::exec для одного и того же QThread объекта из фактически разных потоков...? или есть другие пути?
Записан
niXman
Гость
« Ответ #1 : Июнь 14, 2010, 01:05 »

вряд ли в кют можно что-то подобное сделать.

UP.
о какой технологичный говнокод получился Шокированный -
Код
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;
}
 
 
« Последнее редактирование: Июнь 14, 2010, 13:19 от niXman » Записан
orlangur
Гость
« Ответ #2 : Июнь 14, 2010, 13:33 »

вряд ли в кют можно что-то подобное сделать.

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

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

только я смысла примера не понял, применительно к вопросу...
Записан
niXman
Гость
« Ответ #3 : Июнь 14, 2010, 13:37 »

Цитировать
это по C++1X (почти)стандарту?
с++0х
это рабочий пример. немного обфускаблен(или как это слово сказать?), намеренно Улыбающийся
Цитировать
только я смысла примера не понял, применительно к вопросу...
копирует файл в отдельном потоке. сам освобождает ресурсы и завершает поток при выходе из области видимости.

повторяюсь: код абсолютно рабочий. но реально применять его не советую. есть более правильные решения Улыбающийся
Записан
orlangur
Гость
« Ответ #4 : Июнь 14, 2010, 13:45 »

Цитировать
с++0х
Нынче уже 10-й год, а стандарт все еще не стандарт Улыбающийся, так что наверное все же C++1X

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

эм... суть вопроса была в том: можно ли организовать выполнение цикла обработки сообщений (одного и того же) из разных потоков (по аналогии с boost::asio ioservice'овским методом run), чтобы была возможность параллельно обрабатывать те же сетевые запросы через QNetworkAccessManager.
Записан
niXman
Гость
« Ответ #5 : Июнь 14, 2010, 14:25 »

ой, епс Смеющийся
я не туда запостил Строит глазки
это имел ввиду: http://www.prog.org.ru/topic_13964_0.html

по поводу boost::asio::io_service согласен. но не уверен что получится заставить QNetworkAccessManager обрабатывать свои соощения в нескольких потоках.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.236 секунд. Запросов: 20.