Вслед за this thread, я пытаюсь сделать приложение C++ Builder xe5 с:Indy TCP клиента в поток
- основной формой
TIdTCPClient
TThread
для этогоTIdTCPClient
' s, которое открывает сокет, отправляет запрос, затем прослушивает несколько ответов неопределенно- Действия, которые происходят в сокете, будут вызывать обновления в основной форме
Я не смог найти примеров; примеры, связанные с страницей Indy Demos, не используют нити в своих клиентах, насколько я могу судить.
Мои вопросы:
- Если TIdTCPClient быть на главной форме (в качестве компонента времени разработки), или же она должна быть переменная член класса потока?
- В событиях, инициированных TIdTCPClient, необходимо ли синхронизировать код в обработчиках событий (которые являются функциями-членами моей основной формы)?
- Безопасно ли как для основного потока VCL, так и для клиентского потока выполнять вызовы функций для объекта TIdTCPClient?
В настоящее время я принимаю действия по основной форме в ответ на каждое событие, а также в ответ на получение данных о сокете. В настоящий момент мой код полон временных переменных и функций заглушки, потому что Synchronize
требует закрытия void(void)
, и это довольно спагетти. Поэтому я задаюсь вопросом, не принимаю ли я принципиально неправильный подход.
У TIdSync не было компонента, но я нашел его в. Похоже, он работает только с TIdThread (в настоящее время я использую TThread), поэтому, я думаю, я должен попытаться выяснить, как они работают на основе их документации API. –
Нет, 'TIdSync' не является компонентом, а просто классом. И нет, вам не нужен 'TIdThread', чтобы использовать его. В XE5 это просто оболочка для статического метода 'TThread :: Synchronize()'. В 'IdSync.hpp' вообще не должно быть ссылок на' TIdThread'. Для версий C++ Builder до CB2005 это делает, но вы все равно можете использовать 'TIdSync', не используя' TIdThread' (он просто создает внутри себя для собственного использования). –
Спасибо за это –