Здравствуйте, тема передачи параметров в функцию потока далеко не нова в этом форуме, но все таки, помогите пожайлуста разобраться,
Есть класс,
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 не должна разрушаться или как то изменяться.
Задача усложняется еще тем что мне необходимо будет запускать несколько параллельных потоков в цикле

.
Вобщем, подскажите кто может как обойти данную проблему, как передать в поток сложные структуры данных, возможно другим каким путем ?
Здравствуйте, jlizard, Вы писали:
J>Здравствуйте, тема передачи параметров в функцию потока далеко не нова в этом форуме, но все таки, помогите пожайлуста разобраться,
J>Есть класс,
J>Вобщем, подскажите кто может как обойти данную проблему, как передать в поток сложные структуры данных, возможно другим каким путем ?
мэйл-слоты может подойдут?
... << RSDN@Home 1.1.4 beta 3 rev. 255 {писалось под мелодии [ Сектор Газа — Песенка ]>>
Здравствуйте, 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.
Здравствуйте, 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, пока вродебы работает ...