Передача данных в поток.
Есть поток в который нужно передать данные для обработки. Как сие можно реализовать?
Можно наверное создать скажем (для примера) переменную public в главном потоке, а из дополнительного обращаться к ней, но мне кажется не очень красиво.
Как еще можно?
Снова мои вопросы про потоки :D.
Есть поток в который нужно передать данные для обработки. Как сие можно реализовать?
Можно наверное создать скажем (для примера) переменную public в главном потоке, а из дополнительного обращаться к ней, но мне кажется не очень красиво.
Как еще можно?
Нормально. Только нужна синхронизация.
Снова мои вопросы про потоки :D.
Есть поток в который нужно передать данные для обработки. Как сие можно реализовать?
Можно наверное создать скажем (для примера) переменную public в главном потоке, а из дополнительного обращаться к ней, но мне кажется не очень красиво.
Как еще можно?
А что мешает передавать через lParam ?
А что мешает передавать через lParam ?
это как?
это как?
Это если создаешь поток API-шной ф-й:
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes,
SIZE_T dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter,//<<<<<<< сюда
DWORD dwCreationFlags,
LPDWORD lpThreadId
);
Да не парься, передай в конструктор TThread:)
это как?
Функции создающие потоки имеют параметр, которой передается в созданный ими поток как есть.
uintptr_t _beginthread(
void( *start_address )( void * ),
unsigned stack_size,
void *arglist
);
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes,
SIZE_T dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter,
DWORD dwCreationFlags,
LPDWORD lpThreadId
);
Т.о. ты можешь передать любую информацию в созданный поток.
В принципе, любая обертка над CreateThread должна иметь такой параметр.
Это если создаешь поток API-шной ф-й:
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes,
SIZE_T dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter,//<<<<<<< сюда
DWORD dwCreationFlags,
LPDWORD lpThreadId
);
Да не парься, передай в конструктор TThread:)
Нет поток создаю через Thread Object, т.е. не API.
Как передать через конструктор?
Нет поток создаю через Thread Object, т.е. не API.
Как передать через конструктор?
Так же, как передаешь параметры обычной функции.
Можно еще создать к-нибудь глобальный ресурс (переменныую, список, смотря что хочешь передать), синхронизировать к нему доступ потоков.
Про синхронизацию почитай о мьютексах, симофорах и критичных секциях.
Рихтер
Так же, как передаешь параметры обычной функции.
Можно еще создать к-нибудь глобальный ресурс (переменныую, список, смотря что хочешь передать), синхронизировать к нему доступ потоков.
Т.е. просто создать переменную (для примера) в классе потока и к ней обращаться?!
Т.е. просто создать переменную (для примера) в классе потока и к ней обращаться?!
Переменную сделать закрытой - передавай параметры в конструктор.
Переменную сделать закрытой - передавай параметры в конструктор.
"что-то не догоняю я поезда".
можешь показать как?
"что-то не догоняю я поезда".
можешь показать как?
В теме "Копирования файла в потоке" я аттачил файл - в нем в поток передаются параметры.
В теме "Копирования файла в потоке" я аттачил файл - в нем в поток передаются параметры.
Я разобрался как ты это реализовал. В разделе public класса потока объявляешь функции, которые устанавливают значения членов класса.
В связи с этим два вопроса:
1. Почему просто не объявить членом класса в разделе public те данные к которым необходим доступ из вне?
2. Почему члены класса ты объявляешь в protected, а не скажем private?
Я разобрался как ты это реализовал. В разделе public класса потока объявляешь функции, которые устанавливают значения членов класса.
В связи с этим два вопроса:
1. Почему просто не объявить членом класса в разделе public те данные к которым необходим доступ из вне?
Да никто не запрещает - но зачем?
Мне необходимо обеспечить механизм который будет относительно независим от остальной части программы - в функции я могу проверять соответствие параметров каким либо критериям, устанавливать путь к домашнему каталогу пользователя(что кстати и делается) - если вдруг критерии изменятся - менять мне прийдется в одном месте - в функции. Ну и т.д. Принцип один - это не имеет отношения к остальной части программы - это должно быть скрыто.
2. Почему члены класса ты объявляешь в protected, а не скажем private?
А х.з? Может я планировал наследовать от этого класса? Что кстати и имелось ввиду - предполагался базовый класс и наследование отнего. Потом идея с наследованием оказалась мертворожденной - а переменные остались.
Да никто не запрещает - но зачем?
Мне необходимо обеспечить механизм который будет относительно независим от остальной части программы - в функции я могу проверять соответствие параметров каким либо критериям, устанавливать путь к домашнему каталогу пользователя(что кстати и делается) - если вдруг критерии изменятся - менять мне прийдется в одном месте - в функции. Ну и т.д. Принцип один - это не имеет отношения к остальной части программы - это должно быть скрыто.
А х.з? Может я планировал наследовать от этого класса? Что кстати и имелось ввиду - предполагался базовый класс и наследование отнего. Потом идея с наследованием оказалась мертворожденной - а переменные остались.
все понятно теперь, оправдано такое использование.
спасибо.