powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Передача параметров в потоковую функцию
4 сообщений из 4, страница 1 из 1
Передача параметров в потоковую функцию
    #32389363
Гастелло
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет!
Господа, подскажите ответ на такой вопрос:
Есть структура:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Typedef struct {
   char            ev_type;
   char            ev_padding;
   short           ev_width;
   unsigned       ev_length;
   long             ev_long;
   double          ev_real;
   CCY             ev_currency;
   MHANDLE      ev_handle;
   ULONG          ev_object;
} Value;

Эту струткуру мне нужно передать в качестве параметра в
потоковую фукцию NotyfyEvents.

Запуск потока:
Value val;
тут в val напихали что надо
hThr = CreateThread(NULL,0,NotyfyEvents,(LPVOID) (тут передается val , как ?),0,NULL);

Сама потоковая функция:
DWORD WINAPI NotyfyEvents(LPVOID pParams)
{
Value Tval;
Как привести pParams к Tval ?
}
...
Рейтинг: 0 / 0
Передача параметров в потоковую функцию
    #32389435
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hThr = CreateThread(NULL,0,NotyfyEvents,(LPVOID)(&val),0,NULL);


DWORD WINAPI NotyfyEvents(LPVOID pParams)
{
Value *pTval = (Value*)pParams;
}
...
Рейтинг: 0 / 0
Передача параметров в потоковую функцию
    #32390816
Гастелло
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ага, получилось, но есть еще один косячек:
Как бы так предистория.
Пишу библу раширения функция системы VFP. Фактически это та же DLL , ток
с механизмом вызова функций заточенным под VFP и написанными функциями для обмена данными с VFP и коего чего специализированного.
Параметры из проги в функцию передаются хитрым образом , через структуру ParamBlk. Не будем вдаваться в подробности, главное что параметры достоверно поступают в вызываемую функцию и ини именно те самые.
Нижеприведенный код, это код функции запуска потока, в качетве параметра ей передается ссылка на объект. И он передается.
Есть функция , _SetObjectProperty, она устанавливает свойство указанного объекта в значение котрое завели в структуру типа Value.
Вот прототип:
Код: plaintext
1.
2.
3.
4.
int _SetObjectProperty(Value FAR *objct, char FAR *prop, Value FAR *val,  int fAdd)
objct -  объект
prop -  свойство
val -  значение
fAdd -  признак создания свойсва если оно отсутсвует


Трабл в том что из функции которую вызвали из VFP ,_SetObjectProperty работает, а вот в потоке , куда передали значение структуры содержащей объект не работает и вызывает неисправимую ошибку. В чем грабли ?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
void StartHookEvents(ParamBlk FAR *parm)
{
#define p0 (parm->p[ 0 ].val)
unsigned int uThrID;
HANDLE hThr;
char ident;
Value  pRval;

pRval.ev_type = 'I';
pRval.ev_long =  10 ;
_SetObjectProperty(&p0, "TOP" ,&pRval, 0 ); // тут выполняется, устанавливает  свойство преданного объекта (формы) TOP  в  10 .

hThr =  CreateThread(NULL, 0 ,NotyfyEvents,(LPVOID)(&parm->p[ 0 ].val), 0 ,&uThrID);
_RetInt ( 0 . 10 );
}

А вот потоковая функция(тестовая):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
DWORD WINAPI NotyfyEvents(LPVOID FAR pParams)
{
  Value  *pTval = (Value *)pParams;  // Получили объект
  Value   pRval;                

  pRval.ev_type = 'I';                           // Создали то что хотим присвоить 
  pRval.ev_long =  10 ;                          // cвойству 
 
 _SetObjectProperty(pTval, "TOP" ,&pRval, 0 );  // Тут ошибка при выполнении
...
...
...
}
Компилится и линкуется намана.
Поможите ?
...
Рейтинг: 0 / 0
Передача параметров в потоковую функцию
    #32391368
Tracer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблема в том, что NotyfyEvents ещё не начала работу, а StartHookEvents уже закончила. Поэтому &uThrID имеет неопределённое значение. Так что передавай параметры либо по значению, либо через глобальные ( или те, которые не потеряют актуальности ) либо дождись, пока NotyfyEvents получит переданные параметры. Например так :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
  ...
  CreateThread( ..., NotifyEvents, ... )
  WaitForSingleObject( hNot, INFINITE );
  ....
 
void NotifyEvents( LPVOID data )
{
    mydata = *data;

    SetEvent( hNot );

    ....
}
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Передача параметров в потоковую функцию
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]