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

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

23.06.2012, 23:03. Показов 4402. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru