-
Здравствуйте. Требуется создать отдельный поток и в него добавить работу с сокетами. (Именно отдельный поток т.к. в него еще будет добавлен обработчик времени и т.д.) Делаю следующим образом. uses Classes {$IFDEF MSWINDOWS} , Windows {$ENDIF},SysUtils,ScktComp; type ARThread = class(TThread) ClientSocketE: TClientSocket; private protected procedure Execute; override; end; implementation ........... procedure ARThread.Execute; begin ClientSocketE.Host:='169.254.232.172'; ClientSocketE.Port:=10001; ClientSocketE.Open; repeat sleep(100); until Terminated; end; Поток при запуске сразу выдает ошибку чтения. Ползунок останавливается на ClientSocketE.Port. От порта выскакивание ошибки не зависит. Подскажите, правильно ли я впихиваю сокет в поток и чего не хватает?
-
Для такой схемы больше подойдут синхронные сокеты, используйте Indy к примеру.
-
а ClientSocket вы создали?
-
> правильно ли я впихиваю
Ты его вообще не "ыпихиваешь" - ни правильно, ни неправильно.
Объявить данные типа TClientSocket полем класса ARThread - это теперь называется "пихать" ?
> чего не хватает?
Не хватает собственно конструирования объекта класса TClientSocket
-
> Для такой схемы больше подойдут синхронные сокеты, используйте > Indy к примеру.
Да мне бы попроще. Функции, возлагаемые на поток довольно просты. > а ClientSocket вы создали?
В потоке формы нету, автоматом я его не создавал. > Не хватает собственно конструирования объекта класса TClientSocket
Дикая просьба, поподробнее. Разве класс не создается автоматически при использовании WinSock? И как его создать? Я новичок в этом деле :(
-
> Константин (19.11.2010 10:54:04) [4]
Любые объекты создаются с помощью конструктора Create. Новичек ты должен освоить работу со справкой.
-
-
> Константин (19.11.10 11:15) [6]
> у этого товарища все работает и без конструктора, как ни > странно
У "товарища" ни разу не странно. Он не использует TClientSocket, потому и конструировать его не требуется по причине напрочь отсутствующего оного. Странно как раз у тебя - класс TClientSocket, в отличие от "товарища", ты как раз и используешь, а его объекты не конструируешь.
-
> У "товарища" ни разу не странно
Кстати, у "товарища" действительно "странно" - он без тени сомнения обозвал кодовый поток процессом)
-
> Константин (19.11.10 11:15) [6]
Тогда зачем ты используешь классы, работай с WinSock API
-
Действительно, чтобы сокет работал в отдельном потоке, нужно использовать только WinSock. Возник еще один вопрос. Как изменить время таймаута? Если компьютера с запрашиваемым адресом или портом не существует, приходится ждать секунд 15 чтобы выдалась ошибка с отсутствующим портом. Хотелось бы сократить это время до 0,5 секунды. Схема вроде вот этой не работает:
Основное приложение:
begin ......................открытие потока...... sleep(500); if WaitIPSend=false then ErrAR:= true; end; ................... if ErrAR= true then ...закрытие потока....
Поток: procedure ARThread.Execute; WaitIPSend:=false; .....Инициализация сокета.... WaitIPSend:=true; ........ end; (т.е. если за 0.5 секунды поток не успеет дойти до WaitIPSend, то его закрыть и выдать ошибку) Основное приложение замирает на WaitIPSend и чего-то ждет. WaitIPSend создается в потоке.
После инициализации сокета поток начинает постоянно "общаться" с другим компом (устройством). В случае если выдернуть изернетовский шнурок из компьютера поток повисает на recv(ClientSocketE, reading, sizeof(reading), 0); и ждет, когда там что-то появится. Как правильно обработать подобный сбой?
-
> чтобы сокет работал в отдельном потоке, нужно использовать > только WinSock
Бред сивой кобылы. С тем же замечательным успехом можно использовать и широкоизвестные дельфийские классы, инкапсулирующие винсок-потроха.
|