Форум программистов, компьютерный форум CyberForum.ru

Передача аргумента в созданный поток - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ DFD множество одинаковых функциональных блоков http://www.cyberforum.ru/cpp/thread612138.html
Не знай, куда эту тему определить.. В DFD есть блоки одинаковой функциональности: "осмотр логопеда", "осмотр педиатра", "осмотр невролога" и т.д. Какой-то определенной последовательности их следования нет. Нет ли возможности как-то отразить это одним блоком? Или так и придется все 10 вырисовывать? Спасибо всем, кто откликнется!!!
C++ Класс метафункций: определение, примеры класс метафункций:определение,примеры. http://www.cyberforum.ru/cpp/thread611863.html
Константные вычисления. Типы арифметических метафункций. C++
Помогите написать прогу.Константные вычисления.Опрделение типоф арифметических метафункций над обертками интегральных типов.
Сборка библиотеки pHash C++
Всем привет! Возникла необходимость воспользоваться библиотекой pHash . Нужна она для вычисления хэшей изображений, аудио или видео. В частности мне нужно считать хэши для аудио файлов. Пишу под виндой, соответственно скачал версию библиотеки под винду. К самой библиотеки прилагался исходный код проекта под студию 2008. Однако как мне показалось, эта версия какая-то урезанная (вроде как есть...
C++ Прикладное программирование, что бы мне почитать http://www.cyberforum.ru/cpp/thread609983.html
Добрый день. Хотел спросить совета, поп поводу того, чтобы мне почитать. Хотелось бы заняться изучением прикладного программирования на С++. В данный момент знаю основы С/С++ и немного ООП. Что посоветуете?
C++ Windows Instaler(*.msi) В инсталере есть своя база данных, подскажите что нибудь для управления ею. подробнее

Показать сообщение отдельно
Nick Alte
Эксперт С++
1594 / 986 / 117
Регистрация: 27.09.2009
Сообщений: 1,902
Завершенные тесты: 1
24.06.2012, 11:29     Передача аргумента в созданный поток
При передаче потоку некоего набора аргументов надо убедиться, что данный набор (в нашем случае структура) будет заведомо существовать при обращении к нему (то есть, не "умрёт" раньше времени). Два самых очевидных способа:
а) Создать эту структуру как локальный объект в функции, создающей поток и вызывающей CreateThread с адресом этого объекта. Тогда такая функция должна обязательно дождаться завершения работы потока (например, при помощи WaitForSingleObject).
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// Вызов API-функций с упрощениями, чтобы не завязываться на специфику
struct ThreadArgs {
    int x;
    double y;
    explicit ThreadArgs(int x_ = 0, double y_ = 0): x(x_), y(y_) {}
};
 
void Thread(void* args)
{
    const ThreadArgs *ta = static_cast<const ThreadArgs*>(args);
    printf("%d %f", ta->x, ta->y);
}
 
void CallThread()
{
    ThreadArgs args(1, 2);
    HANDLE hThread = CreateThread(Thread, &args);
    // Тут делаем что-нибудь параллельно основному потоку
    // ...
    WaitForSingleObject(hThread);
    // В этой точке созданный поток уже завершился
}
б) Если дожидаться не хочется, создаём структуру через new, заполняем, передаём указатель на неё в CreateThread и забываем. Ответственность за уничтожение этой структуры при помощи delete возлагаем на сам поток. Таким образом, эта структура передаётся в его владение.
C++
1
2
3
4
5
6
7
8
9
10
11
void Thread(void* args)
{
    const ThreadArgs *ta = static_cast<const ThreadArgs*>(args);
    printf("%d %f", ta->x, ta->y);
    delete args;
}
 
void CallThread()
{
    CreateThread(Thread, new ThreadArgs(1, 2));
}
 
Текущее время: 09:21. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru