Форум программистов, компьютерный форум, киберфорум
Boost C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.81/26: Рейтинг темы: голосов - 26, средняя оценка - 4.81
 Аватар для sogooo
93 / 66 / 27
Регистрация: 11.12.2013
Сообщений: 309

Boost thread

17.01.2015, 19:18. Показов 5371. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Помогите разобраться пожалуйста. Задача будет заключаться в том чтобы, создать поток и передать туда функцию и параметр, после чего метод должен выполниться и поток должен уснуть. А программа дальше работать и создавать следующие потоки.

Есть метод который будет создавать поток. И передавать туда метод с параметром.
C++
1
2
3
4
for (boost::filesystem::directory_iterator it(p); it != boost::filesystem::directory_iterator(); it++){
                boost::thread thread(&File::Readfile, &it->path());
                thread.join();
            }
C++
1
2
3
4
5
6
void File::Readfile(boost::filesystem::path path){
    Тут будет что то делаться, и потом усыплять поток на 1 секунду.
    boost::posix_time::seconds workTime(1);
    boost::this_thread::sleep(workTime);
    
}
Сама проблема заключается в том что когда мы создаём поток происходит ошибка. С передачей параметра.
Не могли бы вы подсказать как исправить её пожалуйста.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.01.2015, 19:18
Ответы с готовыми решениями:

boost::thread
Здравствуйте. Есть два класса. Членом первого из классов является объект второго класса. В первом классе есть метод, в котором я хочу...

queue boost thread
#define BOOST_THREAD_VERSION 2 #include <boost/thread/thread.hpp> #include <boost/thread/xtime.hpp> #include <iostream> #include...

boost::thread() проблема с потоками.
Собственно создается два потока и запускаются следующим образом int main(). { thread1.join(); thread2.join(); ...

21
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
17.01.2015, 20:21
Цитата Сообщение от sogooo Посмотреть сообщение
чего метод должен выполниться и поток должен уснуть.
зачем ему засыпать, если его работа завершена?
0
 Аватар для sogooo
93 / 66 / 27
Регистрация: 11.12.2013
Сообщений: 309
17.01.2015, 20:29  [ТС]
просто для практики, хочется научиться большему.
0
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
18.01.2015, 10:37
Ошибка номер один: на вызов передаётся метод без объекта. Обычному методу нужен объект, к которому он применим, статический метод вызывается как обычная функция.
Ошибка номер два: несовпадение типов (принимается копия filesystem:: path, а передаётся адрес).
1
 Аватар для sogooo
93 / 66 / 27
Регистрация: 11.12.2013
Сообщений: 309
18.01.2015, 21:19  [ТС]
Спасибо большое, разобрался.
Осталось только один вопрос.

Допустим, я создал поток и запустил его, и после чего усыпил его.
Как мне сделать чтобы программа продолжала работу пока поток спит, а не дожидаться того, пока поток проснётся и завершиться целиком.
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
19.01.2015, 10:28
sogooo, Использовать detach на потоке, а не join. При этом, нужно быть уверенным, что родительский поток не завершится до завершения дочернего.
0
2 / 2 / 0
Регистрация: 23.06.2014
Сообщений: 23
17.02.2015, 10:37
Всем привет! Подскажите новичку, не могу понять данный код:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <boost/thread/thread.hpp>
#include <iostream>
#include <stdio>
 
#include <iostream>
#include <windows.h>
boost::mutex io_mutex;
 
struct count
{
  count(int id) : id(id) { }
  void operator()()
  {
    for (int i = 0; i < 10; ++i)
    {
      boost::mutex::scoped_lock lock(io_mutex);
 
      std::cout << id << ": " << i << std::endl;
    }
  }
  int id;
};
 
int _tmain(int argc, char* argv[])
{
  boost::thread thrd1(count(1));
  boost::thread thrd2(count(2));
 
  thrd1.join();
  thrd2.join();
 
  return 0;
}
Зачем в структуре перегружается оператор () ?
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
17.02.2015, 12:27
Функциональные объекты
0
2 / 2 / 0
Регистрация: 23.06.2014
Сообщений: 23
19.02.2015, 11:44
О спасибо разобрался! Теперь такой вопрос, почему если я добавляю в функтор статические член, то сразу вылезает ошибка:
[ILINK32 Error] Error: Unresolved external 'count::num' referenced from C:\USERS\TK14031\DOCUMENTS\RAD STUDIO\PROJECTS\TMP\DEBUG\FILE1.OBJ
код следующий
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <boost/thread/thread.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/bind.hpp>
#include <iostream>
#include <stdio.h>
 
class count
{
  public:
  static int num;
  int id;
 
  count(int id) : id(id) { }
  operator ()()
  {
    num = 0;
    for (int i = 0; i <  10; ++i)
    {
      std::cout<< id<< ": " <<  std::endl;
      //boost::this_thread::interruptible_wait( 1000 );
      boost::this_thread::sleep(boost::posix_time::seconds(1));
    }
  }
};
 
 
int main(int argc, char* argv[])
{
  boost::thread thrd1( count(1) );
  boost::thread thrd2( count(2) );
 
  thrd1.join( );
  thrd2.join( );
 
  getchar();
  return 0;
}
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
19.02.2015, 15:15
Ну как минимум нужно проинициализировать static int num;

Да и вы в курсе что boost/thread в С++Builder работает только в динамической сборке, т.е будет тянуть dll-ки?
0
2 / 2 / 0
Регистрация: 23.06.2014
Сообщений: 23
19.02.2015, 15:46
Я инициализировал в конструкторе, толку было мало (

Добавлено через 1 минуту
Цитата Сообщение от Avazart Посмотреть сообщение
Да и вы в курсе что boost/thread в С++Builder работает только в динамической сборке, т.е будет тянуть dll-ки?
Ничего страшного для меня!
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
19.02.2015, 16:59
Цитата Сообщение от MS2401 Посмотреть сообщение
Я инициализировал в конструкторе, толку было мало (
https://msdn.microsoft.com/ru-... 5y48f.aspx
0
2 / 2 / 0
Регистрация: 23.06.2014
Сообщений: 23
20.02.2015, 11:04
Еще одно спасибо! =)
Теперь другой вопрос, вынес все в отдельный модуль, и хочу в классе объявить мутекс, но почему - то вылетает ошибко, в чем причина?
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#pragma once
#include <boost/thread/thread.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/bind.hpp>
class count
{
  public:
  static int num;
  int id;
  boost::mutex io_mutex;
 
 
  count(int id) : id(id) { }
 
  operator ()()
  {
    for (int i = 0; i <  10; ++i)
    {
      boost::mutex::scoped_lock lock(io_mutex);
      ++num;
      std::cout<< id<< ": " << num << std::endl;
      // boost::this_thread::interruptible_wait( 1000 );
      boost::this_thread::sleep(boost::posix_time::seconds(1));
    }
  }
};
 
int count::num = 0;

вызваю в майне так:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// Пример 3
// Эта программа идентична программе
// из примера 2, кроме того, что
// использует Boost.Bind
// при создании потока,
// принимающего параметры.
#include <boost/thread/thread.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/bind.hpp>
#include <iostream>
#include <stdio.h>
#include "File1.h"
 
int main(int argc, char* argv[])
{
//  count MyClass(1);
  boost::thread thrd1( count(1) );
 
  boost::thread thrd2( count(2) );
  thrd1.join( );
  thrd2.join( );
 
  std::cout<< count::num;
  getchar();
  return 0;
}
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
20.02.2015, 12:55
Ну параметры нужно передавать через boost::bind в оператор (), а не конструктор.Или сначала создавать объект и потом передавать его в поток.
0
2 / 2 / 0
Регистрация: 23.06.2014
Сообщений: 23
20.02.2015, 13:32
Цитата Сообщение от Avazart Посмотреть сообщение
Ну параметры нужно передавать через boost::bind в оператор (), а не конструктор.Или сначала создавать объект и потом передавать его в поток.
А вы бы не могли более подробнее объяснить? Я просто впервые вообще с потоками и бустом работаю.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
20.02.2015, 13:43
Примеры в документации. И вообще какого вы в буст лезите не зная основ STL ?
0
2 / 2 / 0
Регистрация: 23.06.2014
Сообщений: 23
20.02.2015, 13:49
Цитата Сообщение от Avazart Посмотреть сообщение
И вообще какого вы в буст лезите не зная основ STL ?
Так это... если никуда не лезть - ниче ведь и не узнаешь? ....
Все равно не понял...
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
20.02.2015, 14:17
Цитата Сообщение от MS2401 Посмотреть сообщение
Так это... если никуда не лезть - ниче ведь и не узнаешь? ....
Все равно не понял...
Лезь в книги, в данном случае по STL и разберись в функтурах.
0
 Аватар для Whatson2
8 / 8 / 1
Регистрация: 06.09.2014
Сообщений: 52
07.07.2016, 09:13
Добрый день всем (и в частности Avazatr-у)!
Пишу в XE2, boost там 1.39.0
Не вдаваясь в детали, прошу у вас такой-же ответ на вопрос:
"Как из boost::thread выводить сообщения (визуальные) о состоянии выполнения функции не используя родной метод Synchronize() без конфликта с main GUI thread в доступе к VCL?"

Всего от функции в thread-е требуется знать процент выполненной работы (ProgressBar) а также значение строковой переменной, куда заносится информация о текущем выполнении (ShowMessage).

Я пробовал:
1) создать таймер и рас в, скажем, 100 мс (время может подстраиваться) опрашивать локальные переменные thread-а (int и UnicodeString). При этом обращения к ним в самом thread-e (это приращение и присваивание) были не атомарными. Это работало только для ProgressBar->Position, т.е. для int.
2) создать/хукнуть обработчик событий "WM_USER +..." и посылать из потока PostMessage() эти сообщения GUI thread-у (в сообщении всё инкапсулировалось). Работает, но тормоза возникают при длительной работе (2 мин. например), хотя я эти сообщения после обработки и CancelDispatch-ил и WM_NULL-ил и т.д.

Можно ли вообще это сделать?
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
07.07.2016, 12:03
Цитата Сообщение от Whatson2 Посмотреть сообщение
"Как из boost::thread выводить сообщения (визуальные) о состоянии выполнения функции не используя родной метод Synchronize() без конфликта с main GUI thread в доступе к VCL?"
Никак по сути.
Не можно использовать WinApi конечно, но опять же смысл, если есть средства VCL.

Добавлено через 2 минуты
Цитата Сообщение от Whatson2 Посмотреть сообщение
Я пробовал:
1) создать таймер и рас в, скажем, 100 мс (время может подстраиваться) опрашивать локальные переменные thread-а (int и UnicodeString). При этом обращения к ним в самом thread-e (это приращение и присваивание) были не атомарными. Это работало только для ProgressBar->Position, т.е. для int.
2) создать/хукнуть обработчик событий "WM_USER +..." и посылать из потока PostMessage() эти сообщения GUI thread-у (в сообщении всё инкапсулировалось). Работает, но тормоза возникают при длительной работе (2 мин. например), хотя я эти сообщения после обработки и CancelDispatch-ил и WM_NULL-ил и т.д.
Все это ерунда.
Что мешает использовать родной TThread + TIdNotify ?
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.07.2016, 12:03
Помогаю со студенческими работами здесь

boost::thread объясните нубу
Есть код #include &lt;boost/thread/thread.hpp&gt; #include &lt;iostream&gt; #include &lt;windows.h&gt; using namespace std; void...

Исключения в потоке Boost::thread
Имеется функция, которая вызывается в потоке. Внутри функции есть try-catch. Вне потока, если функцию вызывать из main(), исключения...

Не линкуется проект с boost::thread
Здравствуйте! Пытаюсь собрать проект в Code::Blocks на Ubuntu. В проекте используется библиотека boost::thread. Файл...

boost::thread синхронизация с VCL
Здравствуйте, подскажите, как работать с VCL компонентами из boost::thread потока

boost::thread не может найти библиотеку
добрый день, сейчас изучаю boost и потоки в том числе. но постоянно выдает следующую ошибку: Error 1 error LNK1104: cannot open...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru