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

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

23.06.2012, 23:03. Показов 4336. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru