Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/21: Рейтинг темы: голосов - 21, средняя оценка - 4.62
0 / 0 / 0
Регистрация: 04.02.2012
Сообщений: 4

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

23.06.2012, 23:03. Показов 4374. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, суть такова:

Создаётся некий поток:
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];
};

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

Заранее спасибо всем откликнувшимся!)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.06.2012, 23:03
Ответы с готовыми решениями:

Передача в новый поток в качестве аргумента string
хелп:wall: Пытаюсь передать аргумент так: DWORD potoc(char * args) { const char * ta = static_cast <const char *> (args); } ...

Передача функции-члена в качестве аргумента (не через указатель)
Привет! Озадачился такой проблемой - вот пример того, что нужно typedef void(class1::*method)(); void func (method) {}; func...

Как перехватить поток созданный OLE-сервером
Здравствуйте. Используется некоторая программа в качестве OLE-сервера. Программа может генерировать некий текстовый файл и сохранять...

5
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
23.06.2012, 23:30
Цитата Сообщение от dimon4ik062 Посмотреть сообщение
Изначально данные замечательно записываются в выше указанную структуру, но, к сожалению, я не могу их передать в структуру
кто тут первая структура, а кто вторая? %)
0
 Аватар для Airhand
537 / 459 / 3
Регистрация: 08.07.2009
Сообщений: 2,625
24.06.2012, 00:33
Я полагаю, что данный параметр функции CreateThread является одиночным, т.е. это не адрес параметра, а сам параметр, т.е. указатель на воид является ЗНАЧЕНИЕМ передаваемым в созданный поток.
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
24.06.2012, 01:38
Цитата Сообщение от Airhand Посмотреть сообщение
данный параметр функции CreateThread является одиночным, т.е. это не адрес параметра, а сам параметр, т.е. указатель на воид является ЗНАЧЕНИЕМ передаваемым в созданный поток.
признаюсь - я ничего не понял %)
0
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
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
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
24.06.2012, 11:33
я подозревал что проблема в этом. но хотел получить внятное объяснение от ТС, чтоб не тыкать пальцем в небо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.06.2012, 11:33
Помогаю со студенческими работами здесь

Передача функции как аргумента
Подскажите, пожалуйста, как передать функцию в качестве аргумента в другую функцию, чтобы там ее выполнить

Передача в поток
Доброго дня, ребята подскажите как правильно реализовать bool Unlocker(AnsiString FileName) // { STARTUPINFO si = {0}; ...

Передача параметров в поток
Добрый день. Имеется основная форма, где объявлена переменная AnsiString LineMessage. Там же в нее заносится содержание текстового файла....

Передача массива из потока в поток
Написал очень кривую программу, помогите поправить, поскольку прогать только начинаю, что она делает: во втором потоке формируется массив...

Передача параметров в поток и обратно
Есть поток (модуль потока Unit2.cpp) //--------------------------------------------------------------------------- #include...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru