Событие OnConnect не запускается при использовании TClientSocket внутри TThread в неблокирующем режиме

Я пытаюсь использовать Borlands TClientSocket компонент в неблокирующем режиме внутри многопоточного приложения C ++ для Windows. Я создаю несколько потоков (классы, полученные из TThread), каждый из которых создает свой TClientSocket объект. Затем я назначаю функции-члены класса потока в качестве обработчиков событий для OnConnect, OnDisconnect а также OnSocketError события сокета. Проблема, с которой я сталкиваюсь, заключается в том, что TClientSocket::Open() функция изнутри TThread::Execute() функция, OnConnect событие никогда не срабатывает. Однако, когда я звоню Open() функция из потока VCL до TThread::Execute() вызывается функция, все события запускаются, и я могу использовать комбинацию потоков-сокетов, как мне хотелось бы. Сейчас я не читал ничего в документации, которая говорит, что TClientSocket не следует использовать в неблокирующем режиме при использовании внутри потока, но мне кажется, что, возможно, что-то неправильно концептуально в том, как я пытаюсь использовать этот класс. Документация Borland по этому вопросу довольно скудная, и эти компоненты уже устарели, поэтому трудно получить достоверную информацию. Несмотря на то, что я устарел, я должен использовать их, так как у меня нет альтернативы в пакете Builder 6. Может кто-нибудь, пожалуйста, сообщите мне, если есть правильный / неправильный способ использования TThread и неблокирующая TClientSocket в комбинации. У меня никогда не было проблем с использованием его как части потока VCL, и никогда раньше не было проблем с использованием TServerSocket, и я действительно не могу понять, почему некоторые события не запускаются.

1

Решение

TClientSocket в неблокирующем режиме использует скрытое окно для получения событий сокета. Если вы используете неблокирующую TClientSocket в TThread тогда вы должны реализовать цикл сообщений внутри вашего TThread::Execute() метод для отправки этих сообщений в окно сокета. Кроме того, будучи основанным на окне, это также означает, что сообщения сокетов отправляются потоку, который фактически создает окно сокетов, поэтому вы должны убедиться, что открываете TClientSocket изнутри вашего TThread::Execute() метод.

Кстати, BCB6 поставляется с Indy 8, который является альтернативой. Вы также можете установить последнюю версию Indy или даже другую стороннюю библиотеку, такую ​​как ICS или Synapse.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]