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

C++

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

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

23.06.2012, 23:03. Просмотров 1715. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.06.2012, 23:03
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Передача аргумента в созданный поток (C++):

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

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

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
niXman
Эксперт C++
3135 / 1447 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
23.06.2012, 23:30 #2
Цитата Сообщение от dimon4ik062 Посмотреть сообщение
Изначально данные замечательно записываются в выше указанную структуру, но, к сожалению, я не могу их передать в структуру
кто тут первая структура, а кто вторая? %)
0
Airhand
502 / 458 / 3
Регистрация: 08.07.2009
Сообщений: 2,625
24.06.2012, 00:33 #3
Я полагаю, что данный параметр функции CreateThread является одиночным, т.е. это не адрес параметра, а сам параметр, т.е. указатель на воид является ЗНАЧЕНИЕМ передаваемым в созданный поток.
0
niXman
Эксперт C++
3135 / 1447 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
24.06.2012, 01:38 #4
Цитата Сообщение от Airhand Посмотреть сообщение
данный параметр функции CreateThread является одиночным, т.е. это не адрес параметра, а сам параметр, т.е. указатель на воид является ЗНАЧЕНИЕМ передаваемым в созданный поток.
признаюсь - я ничего не понял %)
0
Nick Alte
Эксперт С++
1637 / 1009 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 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));
}
2
niXman
Эксперт C++
3135 / 1447 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
24.06.2012, 11:33 #6
я подозревал что проблема в этом. но хотел получить внятное объяснение от ТС, чтоб не тыкать пальцем в небо.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.06.2012, 11:33
Привет! Вот еще темы с ответами:

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

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

.NET 4.x Как завершить созданный поток? - C#
Вопрос такой , при помощи класса Thread создается второй поток , он работает , все хорошо , но проблема в том что я не могу его прекратить...

Как убить поток, созданный динамически - C#
К примеру поток создаётся так: void MyMetod(int a, int b) { MessageBox.Show((a * b).ToString()); } ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
24.06.2012, 11:33
Ответ Создать тему
Опции темы

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