::AfxBeginThread Helppp!!
От: jlizard  
Дата: 08.01.05 16:19
Оценка:
Здравствуйте, тема передачи параметров в функцию потока далеко не нова в этом форуме, но все таки, помогите пожайлуста разобраться,
Есть класс,

class CHTTPPicker
{
public:
CHTTPPicker( HWND hWnd );
~CHTTPPicker(void);
void Start(void);
/// thread function
static UINT RequestProcess(LPVOID lpParam);

private:
HWND hWnd;
IN_THREAD_PARAM in_thread_param;
...
...
}

В функцию потока необходимо передать такую структуру,
struct IN_THREAD_PARAM
{
HWND hWnd;
CString czStr1;
CString czStr2;
CStringList cslList; //( или CStringArray )
};

// constructor
CHTTPPicker::CHTTPPicker( HWND hWnd )
{
// заполняю структуру
in_thread_param.hWnd = hWnd;
...
...
}

// вызов функции потока
void CHTTPPicker::Start(void)
{

AfxBeginThread( (AFX_THREADPROC) CHTTPPicker::RequestProcess,
(LPVOID) &in_thread_param );
// sleep(100); // AfxMessageBox("");
}

// функция потока
UINT CHTTPPicker::RequestProcess(LPVOID lpParam)
{
IN_THREAD_PARAM *in_thread_param = (IN_THREAD_PARAM *)lpParam;

//или:
//IN_THREAD_PARAM in_thread_param;
//memcpy( &in_thread_param, lpParam, sizeof(IN_THREAD_PARAM) );
...
...
return 0;
}

Проблема,
в функции потока при инициализации in_thread_param данные из lpParam теряются,
если после AfxBeginThread, поставить Sleep(200) или AfxMessageBox, то все отрабатывает
нормально.
Как решить эту проблему ? in_thread_param — член класса, видна всем функциям данного класа, по идее, по завершению Start() до инициализации данных в потоке(до запуска потока), in_thread_param не должна разрушаться или как то изменяться.
Задача усложняется еще тем что мне необходимо будет запускать несколько параллельных потоков в цикле .
Вобщем, подскажите кто может как обойти данную проблему, как передать в поток сложные структуры данных, возможно другим каким путем ?
Re: ::AfxBeginThread Helppp!!
От: _chipset Россия http://merlinko.com
Дата: 08.01.05 16:25
Оценка:
Здравствуйте, jlizard, Вы писали:

J>Здравствуйте, тема передачи параметров в функцию потока далеко не нова в этом форуме, но все таки, помогите пожайлуста разобраться,

J>Есть класс,


J>Вобщем, подскажите кто может как обойти данную проблему, как передать в поток сложные структуры данных, возможно другим каким путем ?


мэйл-слоты может подойдут?
... << RSDN@Home 1.1.4 beta 3 rev. 255 {писалось под мелодии [ Сектор Газа — Песенка ]>>
"Всё что не убивает нас, делает нас сильнее..."
Re: ::AfxBeginThread Helppp!!
От: kzua  
Дата: 09.01.05 18:35
Оценка:
Здравствуйте, jlizard, Вы писали:

J>Здравствуйте, тема передачи параметров в функцию потока далеко не нова в этом форуме, но все таки, помогите пожайлуста разобраться,

J>Есть класс,

J>class CHTTPPicker

J>{
J>public:
J> CHTTPPicker( HWND hWnd );
J> ~CHTTPPicker(void);
J> void Start(void);
J> /// thread function
J> static UINT RequestProcess(LPVOID lpParam);

J>private:

J> HWND hWnd;
J> IN_THREAD_PARAM in_thread_param;
J>...
J>...
J>}

J>В функцию потока необходимо передать такую структуру,

J>struct IN_THREAD_PARAM
J>{
J> HWND hWnd;
J> CString czStr1;
J> CString czStr2;
J> CStringList cslList; //( или CStringArray )
J>};

J>// constructor

J>CHTTPPicker::CHTTPPicker( HWND hWnd )
J>{
J> // заполняю структуру
J> in_thread_param.hWnd = hWnd;
J> ...
J> ...
J>}

J>// вызов функции потока

J>void CHTTPPicker::Start(void)
J>{

J> AfxBeginThread( (AFX_THREADPROC) CHTTPPicker::RequestProcess,

J> (LPVOID) &in_thread_param );
J> // sleep(100); // AfxMessageBox("");
J>}

J>// функция потока

J>UINT CHTTPPicker::RequestProcess(LPVOID lpParam)
J>{
J> IN_THREAD_PARAM *in_thread_param = (IN_THREAD_PARAM *)lpParam;

J> //или:

J> //IN_THREAD_PARAM in_thread_param;
J> //memcpy( &in_thread_param, lpParam, sizeof(IN_THREAD_PARAM) );
J> ...
J> ...
J> return 0;
J>}

J>Проблема,

J>в функции потока при инициализации in_thread_param данные из lpParam теряются,
J>если после AfxBeginThread, поставить Sleep(200) или AfxMessageBox, то все отрабатывает
J>нормально.
J>Как решить эту проблему ? in_thread_param — член класса, видна всем функциям данного класа, по идее, по завершению Start() до инициализации данных в потоке(до запуска потока), in_thread_param не должна разрушаться или как то изменяться.
J>Задача усложняется еще тем что мне необходимо будет запускать несколько параллельных потоков в цикле .
J>Вобщем, подскажите кто может как обойти данную проблему, как передать в поток сложные структуры данных, возможно другим каким путем ?

Рискну предположить, что разрушается объект класса CHTTPPicker.
Нужно смотреть полный код, чтобы было видно время жизни объекта класса CHTTPPicker.
Re[2]: ::AfxBeginThread Helppp!!
От: jlizard  
Дата: 10.01.05 13:59
Оценка:
Здравствуйте, kzua, Вы писали:

K>Здравствуйте, jlizard, Вы писали:


J>>Здравствуйте, тема передачи параметров в функцию потока далеко не нова в этом форуме, но все таки, помогите пожайлуста разобраться,

J>>Есть класс,

J>>class CHTTPPicker

J>>{
J>>public:
J>> CHTTPPicker( HWND hWnd );
J>> ~CHTTPPicker(void);
J>> void Start(void);
J>> /// thread function
J>> static UINT RequestProcess(LPVOID lpParam);

J>>private:

J>> HWND hWnd;
J>> IN_THREAD_PARAM in_thread_param;
J>>...
J>>...
J>>}

J>>В функцию потока необходимо передать такую структуру,

J>>struct IN_THREAD_PARAM
J>>{
J>> HWND hWnd;
J>> CString czStr1;
J>> CString czStr2;
J>> CStringList cslList; //( или CStringArray )
J>>};

J>>// constructor

J>>CHTTPPicker::CHTTPPicker( HWND hWnd )
J>>{
J>> // заполняю структуру
J>> in_thread_param.hWnd = hWnd;
J>> ...
J>> ...
J>>}

J>>// вызов функции потока

J>>void CHTTPPicker::Start(void)
J>>{

J>> AfxBeginThread( (AFX_THREADPROC) CHTTPPicker::RequestProcess,

J>> (LPVOID) &in_thread_param );
J>> // sleep(100); // AfxMessageBox("");
J>>}

J>>// функция потока

J>>UINT CHTTPPicker::RequestProcess(LPVOID lpParam)
J>>{
J>> IN_THREAD_PARAM *in_thread_param = (IN_THREAD_PARAM *)lpParam;

J>> //или:

J>> //IN_THREAD_PARAM in_thread_param;
J>> //memcpy( &in_thread_param, lpParam, sizeof(IN_THREAD_PARAM) );
J>> ...
J>> ...
J>> return 0;
J>>}

J>>Проблема,

J>>в функции потока при инициализации in_thread_param данные из lpParam теряются,
J>>если после AfxBeginThread, поставить Sleep(200) или AfxMessageBox, то все отрабатывает
J>>нормально.
J>>Как решить эту проблему ? in_thread_param — член класса, видна всем функциям данного класа, по идее, по завершению Start() до инициализации данных в потоке(до запуска потока), in_thread_param не должна разрушаться или как то изменяться.
J>>Задача усложняется еще тем что мне необходимо будет запускать несколько параллельных потоков в цикле .
J>>Вобщем, подскажите кто может как обойти данную проблему, как передать в поток сложные структуры данных, возможно другим каким путем ?

K>Рискну предположить, что разрушается объект класса CHTTPPicker.

K>Нужно смотреть полный код, чтобы было видно время жизни объекта класса CHTTPPicker.

Спасибо всем, изменил структуру in_thread_param таким образом,
struct KEYWORDS
{
CString csKeyword;
KEYWORDS *pNextKeyword;
};

struct IN_THREAD_PARAM
{
HWND hWnd;
SEARCH_SYSTEM_PARAM search_param;
KEYWORDS *pKeyword;
};
т.е. заменил CStringList на KEYWORDS, пока вродебы работает ...
Re: ::AfxBeginThread Helppp!!
От: uname Россия  
Дата: 10.01.05 14:10
Оценка:
Где вызывается start()? Что после её вызова происходит?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.