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

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

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

Показать сообщение отдельно
Nick Alte
Эксперт С++
1639 / 1011 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 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));
}
2
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru