В этой статье Embarcadero описывается использование блокирующего сокета внутри потока. Если я создал свой сокет ctNonBlocking
и я только писать простые сообщения в сокет я должен использовать TClientWinSocket.SendText
:Используйте неблокирующий TClientSocket внутри потока
// Inside TThread::Execute: Option 1
strMessage := 'Hello!';
mySocket.Socket.SendText(strMessage);
или я должен создать TWinSocketStream
и используя Write
:
// Inside TThread::Execute: Option 2
strMessage := 'Hello!';
stream := TWinSocketStream.Create(mySocket.Socket, 1000);
stream.Write(strMessage[1], Length(strMessage));
Что Я нахожу, что мое приложение выдает исключение при выходе (после Application.Run()
в DPR-файле и невозможно отладить), которое исчезает, если я прокомментирую весь код TClientSocket.
Почему вы делаете эту странную вещь? Если вы собираетесь поднимать поток, почему не блокируете? Где вызов вашего конструктора для экземпляра TClientSocket? Пожалуйста, не говорите, что вы сбросили его на форму: (( –
Сокет создается в функции инициализации потока сразу после создания потока, как в 'mySocket: = TClientSocket.Create (nil);', а затем 'mySocket. ClientType: = ctNonBlocking; '. Я установил сокет как неблокирующий, потому что мне показалось проще, но я здесь, чтобы узнать. Если это странно, то я посмотрю на блокирующий вариант ... – AlainD
См. Комментарий к принятому решению. В основном я следовал примеру кода в статье Embarcadero, упомянутой в вопросе (преобразование TClientSocket из режима неблокирования в блокирующий). Это оказалось относительно простым. Конечно, способ, которым я пользовался раньше, был «странным «... использование его в режиме блокировки внутри потока отлично работает! – AlainD