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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.62
dimon4ik062
0 / 0 / 0
Регистрация: 04.02.2012
Сообщений: 4
23.06.2012, 23:03     Передача аргумента в созданный поток #1
Здравствуйте, суть такова:

Создаётся некий поток:
C++
1
2
3
4
5
6
DWORD WINAPI MyThread(LPVOID lpParam)
{
    MyStruct data = *(MyStruct*) lpParam;
    
        ...
}
как видим, Я пытаюсь передать в параметре данные в некой структуре MyStruct данным кодом:
C++
1
2
3
4
5
6
7
8
9
    
HANDLE hThread;
MyStruct data;
           
strcpy(data.var1, "qweqweqwt");
strcpy(data.var2, "qweqweqwe");
            
hThread = CreateThread(NULL, 0, MyThread, &data, 0, NULL);
CloseHandle(hThread);
и собственно сама структура:
C++
1
2
3
4
5
struct MyStruct
{
   char var1[1024];
   char var2[1024];
};

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

Заранее спасибо всем откликнувшимся!)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.06.2012, 23:03     Передача аргумента в созданный поток
Посмотрите здесь:

Как перехватить поток созданный OLE-сервером C++ Builder
C++ Передача функции в качестве аргумента массив
Передача двухмерного массива в качестве аргумента C++
C++ Builder Передача в поток
argv и argc передача аргумента(пароль) C++
C++ Builder Передача функции как аргумента
Передача перегруженной функции как аргумента C++
C++ Передача в новый поток в качестве аргумента string
C++ Передача матрицы в метод в качестве аргумента
C++ Передача массива в качестве аргумента функции
Передача в функцию аргумента C++
Передача аргумента по умолчанию C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
niXman
Эксперт C++
 Аватар для niXman
3133 / 1445 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
23.06.2012, 23:30     Передача аргумента в созданный поток #2
Цитата Сообщение от dimon4ik062 Посмотреть сообщение
Изначально данные замечательно записываются в выше указанную структуру, но, к сожалению, я не могу их передать в структуру
кто тут первая структура, а кто вторая? %)
Airhand
 Аватар для Airhand
502 / 458 / 3
Регистрация: 08.07.2009
Сообщений: 2,625
24.06.2012, 00:33     Передача аргумента в созданный поток #3
Я полагаю, что данный параметр функции CreateThread является одиночным, т.е. это не адрес параметра, а сам параметр, т.е. указатель на воид является ЗНАЧЕНИЕМ передаваемым в созданный поток.
niXman
Эксперт C++
 Аватар для niXman
3133 / 1445 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
24.06.2012, 01:38     Передача аргумента в созданный поток #4
Цитата Сообщение от Airhand Посмотреть сообщение
данный параметр функции CreateThread является одиночным, т.е. это не адрес параметра, а сам параметр, т.е. указатель на воид является ЗНАЧЕНИЕМ передаваемым в созданный поток.
признаюсь - я ничего не понял %)
Nick Alte
Эксперт С++
1594 / 986 / 117
Регистрация: 27.09.2009
Сообщений: 1,902
Завершенные тесты: 1
24.06.2012, 11:29     Передача аргумента в созданный поток #5
При передаче потоку некоего набора аргументов надо убедиться, что данный набор (в нашем случае структура) будет заведомо существовать при обращении к нему (то есть, не "умрёт" раньше времени). Два самых очевидных способа:
а) Создать эту структуру как локальный объект в функции, создающей поток и вызывающей 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));
}
niXman
Эксперт C++
 Аватар для niXman
3133 / 1445 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
24.06.2012, 11:33     Передача аргумента в созданный поток #6
я подозревал что проблема в этом. но хотел получить внятное объяснение от ТС, чтоб не тыкать пальцем в небо.
Yandex
Объявления
24.06.2012, 11:33     Передача аргумента в созданный поток
Ответ Создать тему
Опции темы

Текущее время: 14:37. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru