Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > параметры вызова потока (CreateThread).


Автор: 0x00 5.5.2006, 15:16
здраствуйте...
у меня возникли проблемы... помогите 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;
}

 

Автор: _hunter 5.5.2006, 15:21
память под param в main выдели (new) и скопируй туда текст тем же strcpy 

Автор: 0x00 5.5.2006, 15:28
а пример можно? 

Автор: Fazil6 5.5.2006, 15:29
поменяй функции местами и будет компиляться
Код

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;
}    


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

Автор: 0x00 5.5.2006, 15:35
дело в том, что char param является не массивом, а именно указателем на него. 

Автор: _hunter 5.5.2006, 15:40
    char *param="simple str";    
    char* param2 = new char[10];
    strcpy(param2, param);
    CreateThread(NULL, NULL, SimpleFunc, param2, NULL, NULL);
 

Автор: Fazil6 5.5.2006, 15:42
Цитата

дело в том, что 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';

 

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

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

Автор: Fazil6 5.5.2006, 16:02
Цитата

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

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

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

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

может param равен 0 

Автор: 0x00 5.5.2006, 16:04
в поток передать указатель на char, и в потоке переданное значение присвоить другому указателю.

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

и вот еще...

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

после передачи параметра param в поток - в потоке он 0.
как этого избежать? как зарезервировать правильно? 

Автор: Fazil6 5.5.2006, 16:11
покажи полностью какой у тебя код.
небось никакой синхронизации нет. Ты передаешь указатели между потоками, а это далеко небезопасно. Один поток передав указатель может сразу удалить то, что там находилось, а второй после этого пытается с этими данными работать. Короче, много чего может быть  

Автор: cozzzy 5.5.2006, 16:11
Вообще-то дядя Рихтер рекомендует использовать _beginthreadex вместо CreateThread  smile  

Автор: Fazil6 5.5.2006, 16:16
Цитата

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

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

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

возвращает не 0 

Автор: 0x00 5.5.2006, 16:18
Код

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


вот.  

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

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


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

и 2-е. скорее всего дело во времени жизи какогото объекта.
покажи полностью весь свой код. 

Автор: 0x00 5.5.2006, 16:22
весь код полностью - это много-много страниц =)
код, где ошибка - я представил выше.

Добавлено @ 16:30 
вот нерабочий код..

Код

#include <windows.h>
#include <string.h>


DWORD WINAPI Start(LPVOID cmd){    
    char *sex;    
    sex=static_cast<char*>(cmd);    
    MessageBox(NULL, sex, "", NULL); // пничего не показывает
return 1;    
}

void main(void){
    char str[] = "str1 str2";
    char *tmp = strtok(str, " ");    
    char *cmd = strtok(NULL, " ");
    MessageBox(NULL, tmp, "", NULL); // то, что надо
    MessageBox(NULL, cmd, "", NULL); // то, что надо
    CreateThread(NULL,NULL, Start, tmp, NULL, NULL); // вызываю. в потоке msgbox не работает.
    CreateThread(NULL,NULL, Start, cmd, NULL, NULL);
}
  

Автор: LuckLess 5.5.2006, 16:34
попробуй
Код

#include <windows.h>
#include <string.h>
DWORD WINAPI Start(LPVOID cmd){    
    char *sex;    
    sex=static_cast<char*>(cmd);    
    MessageBox(NULL, sex, "", NULL); // ïîêàçûâàåò êàðàêóëè    
return 1;    
}    
void main(void){
    char *str = "str1||str2";
    char *tmp = strtok(str, " ");    
    char *cmd = strtok(NULL, " ");
    MessageBox(NULL, cmd, "", NULL); // - ïîêàçûâàåò òî, ÷òî íàäî    
    WaitForSingleObject(CreateThread(NULL,NULL, Start, cmd, NULL, NULL));    
}


Добавлено @ 16:36 
точнее
Код

#include <windows.h>
#include <string.h>
DWORD WINAPI Start(LPVOID cmd){    
    char *sex;    
    sex=static_cast<char*>(cmd);    
    MessageBox(NULL, sex, "", NULL); // ïîêàçûâàåò êàðàêóëè    
return 1;    
}    
void main(void){
    char *str = "str1||str2";
    char *tmp = strtok(str, " ");    
    char *cmd = strtok(NULL, " ");
    MessageBox(NULL, cmd, "", NULL); // - ïîêàçûâàåò òî, ÷òî íàäî    
    WaitForSingleObject(CreateThread(NULL,NULL, Start, cmd, NULL, NULL),INFINITE);    
}
 

Автор: 0x00 7.5.2006, 12:59
не работает.
в поток передается 0. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)