Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> параметры вызова потока (CreateThread). проблемы... 
:(
    Опции темы
0x00
Дата 5.5.2006, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 192
Регистрация: 3.4.2006

Репутация: нет
Всего: нет



здраствуйте...
у меня возникли проблемы... помогите Plz.

как передать в поток параметр...

пример (псевдокодами=)):
помогите пожайлусто сделать нижеприведенный код работоспособным.

Код

#include <windows.h>

void main(void){
    char *param="simple str";
    CreateThread(NULL, NULL, SimpleFunc, param, NULL, NULL);
}

DWORD WINAPI SimpleFunc(LPVOID param){
    char *param_in;
    param_in = (char*)param;
    MessageBox(NULL, param_in, "", NULL);
return 0;
}

 
PM MAIL   Вверх
_hunter
Дата 5.5.2006, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



память под param в main выдели (new) и скопируй туда текст тем же strcpy 


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
0x00
Дата 5.5.2006, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 192
Регистрация: 3.4.2006

Репутация: нет
Всего: нет



а пример можно? 
PM MAIL   Вверх
Fazil6
Дата 5.5.2006, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



поменяй функции местами и будет компиляться
Код

param_in = (char*)param;

замени на 
Код

param_in = static_cast<char*>(param);



вообще что значит работоспособно?
Код

#include <windows.h>    

DWORD WINAPI SimpleFunc(LPVOID param){    
    char *param_in;    
    param_in = static_cast<char*>(param);
    while(1)
    {
      ::MessageBox(NULL, param_in, "", NULL);    
    }
    
    return 0;    
}

int main(int argc, char* argv[]){    
    char param[]="simple str";    
    HANDLE h = CreateThread(NULL, NULL, SimpleFunc, param, NULL, NULL);
    Sleep(5000);

return 0;
}    


вот такой вариант бессмысленный  

Это сообщение отредактировал(а) Fazil6 - 5.5.2006, 15:30
PM MAIL   Вверх
0x00
Дата 5.5.2006, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 192
Регистрация: 3.4.2006

Репутация: нет
Всего: нет



дело в том, что char param является не массивом, а именно указателем на него. 
PM MAIL   Вверх
_hunter
Дата 5.5.2006, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



    char *param="simple str";    
    char* param2 = new char[10];
    strcpy(param2, param);
    CreateThread(NULL, NULL, SimpleFunc, param2, NULL, NULL);
 


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Fazil6
Дата 5.5.2006, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата

дело в том, что char param является не массивом, а именно указателем на него. 

на кого?
Код

char *param ; //   param - указатель на char
char param[]  = "simple str";   //   param - указатель на первый элемент, т.е. на char


Добавлено @ 15:50 
_hunter
если уж даешь пример, то не учи плохому

Код

const int MAX_STR_LEN = 10;

char param[]  = "simple str";


char* param2 = new char[MAX_STR_LEN];
strncpy(param2, param, MAX_STR_LEN - 1);
param2[MAX_STR_LEN] = '\0';

 
PM MAIL   Вверх
0x00
Дата 5.5.2006, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 192
Регистрация: 3.4.2006

Репутация: нет
Всего: нет



и еще... дело в том, что значение param - не константа, а является результатом работы ф-ции strtok...

Добавлено @ 16:00 
ошибка возникает в потоке, после param_in = static_cast<char*>(param); 
PM MAIL   Вверх
Fazil6
Дата 5.5.2006, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата

и еще... дело в том, что значение param - не константа, а является результатом работы ф-ции strtok... 

ну и что? 
Здается мне здесь вопрос совсем не про потоки.
что ты пытаешься сделать?

Добавлено @ 16:04 
Цитата

ошибка возникает в потоке, после param_in = static_cast<char*>(param); 

может param равен 0 
PM MAIL   Вверх
0x00
Дата 5.5.2006, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 192
Регистрация: 3.4.2006

Репутация: нет
Всего: нет



в поток передать указатель на char, и в потоке переданное значение присвоить другому указателю.

Добавлено @ 16:08 
да.... точно! thx... 

и вот еще...

char *param=strtok(in_str, "");

после передачи параметра param в поток - в потоке он 0.
как этого избежать? как зарезервировать правильно? 
PM MAIL   Вверх
Fazil6
Дата 5.5.2006, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



покажи полностью какой у тебя код.
небось никакой синхронизации нет. Ты передаешь указатели между потоками, а это далеко небезопасно. Один поток передав указатель может сразу удалить то, что там находилось, а второй после этого пытается с этими данными работать. Короче, много чего может быть  
PM MAIL   Вверх
cozzzy
Дата 5.5.2006, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 29.4.2006
Где: Харьков

Репутация: нет
Всего: нет



Вообще-то дядя Рихтер рекомендует использовать _beginthreadex вместо CreateThread  smile  
PM MAIL   Вверх
Fazil6
Дата 5.5.2006, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата

после передачи параметра param в поток - в потоке он 0

вообще-то я не уверен, что это
Код

char *param=strtok(in_str, "");

возвращает не 0 
PM MAIL   Вверх
0x00
Дата 5.5.2006, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 192
Регистрация: 3.4.2006

Репутация: нет
Всего: нет



Код

DWORD WINAPI Start(LPVOID cmd){
char *sex;
sex=static_cast<char*>(cmd);
MessageBox(NULL, sex, "", NULL); // показывает каракули
return1;
}

//~cut1
char *cmd = strtok(str, " ");
MessageBox(NULL, cmd, "", NULL); // - показывает то, что надо
CreateThread(NULL,NULL, Start, cmd, NULL, NULL); 
//~cut1


вот.  

Это сообщение отредактировал(а) 0x00 - 5.5.2006, 16:21
PM MAIL   Вверх
LuckLess
Дата 5.5.2006, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 15.9.2004

Репутация: 1
Всего: 1



Цитата(cozzzy @  5.5.2006,  16:11 Найти цитируемый пост)
Вообще-то дядя Рихтер рекомендует использовать _beginthreadex вместо CreateThread  smile   

да не только дядя Рихтер, а мелкомягкие.


0x00
во первых замени CreateThread на _beginthreadex ,как сказал Cozzy,  т.к. CreateThread очень не безопасно.  Когда ты активно пользуешь CRT CreateThread небезопасна вдвойне.

и 2-е. скорее всего дело во времени жизи какогото объекта.
покажи полностью весь свой код. 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0863 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.