Конференция "Сети" » Добавить Socket в поток, ошибка. [D7, WinXP]
 
  • Константин (18.11.10 00:48) [0]
    Здравствуйте. Требуется создать отдельный поток и в него добавить работу с сокетами. (Именно отдельный поток т.к. в него еще будет добавлен обработчик времени и т.д.) Делаю следующим образом.
    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. От порта выскакивание ошибки не зависит. Подскажите, правильно ли я впихиваю сокет в поток и чего не хватает?
  • Eraser © (18.11.10 02:50) [1]
    Для такой схемы больше подойдут синхронные сокеты, используйте Indy к примеру.
  • CrytoGen (18.11.10 07:37) [2]
    а ClientSocket вы создали?
  • Сергей М. © (18.11.10 09:36) [3]

    > правильно ли я впихиваю


    Ты его вообще не "ыпихиваешь" - ни правильно, ни неправильно.

    Объявить данные типа TClientSocket полем класса  ARThread - это теперь называется "пихать" ?


    > чего не хватает?


    Не хватает собственно конструирования объекта класса TClientSocket
  • Константин (19.11.10 10:54) [4]

    > Для такой схемы больше подойдут синхронные сокеты, используйте
    > Indy к примеру.

    Да мне бы попроще. Функции, возлагаемые на поток довольно просты.
    > а ClientSocket вы создали?

    В потоке формы нету, автоматом я его не создавал.
    > Не хватает собственно конструирования объекта класса TClientSocket

    Дикая просьба, поподробнее. Разве класс не создается автоматически при использовании WinSock? И как его создать? Я новичок в этом деле :(
  • Anatoly Podgoretsky © (19.11.10 11:12) [5]
    > Константин  (19.11.2010 10:54:04)  [4]

    Любые объекты создаются с помощью конструктора Create.
    Новичек ты должен освоить работу со справкой.
  • Константин (19.11.10 11:15) [6]
    http://www.webcorp.ru/page/delphi_soket.html Кстати вот у этого товарища все работает и без конструктора, как ни странно.
  • Сергей М. © (19.11.10 12:08) [7]

    > Константин   (19.11.10 11:15) [6]


    > у этого товарища все работает и без конструктора, как ни
    > странно


    У "товарища" ни разу не странно. Он не использует TClientSocket, потому и конструировать его не требуется по причине напрочь отсутствующего оного.
    Странно как раз у тебя - класс TClientSocket, в отличие от "товарища", ты как раз и используешь, а его объекты не конструируешь.
  • Сергей М. © (19.11.10 12:10) [8]

    > У "товарища" ни разу не странно


    Кстати, у "товарища" действительно "странно" - он без тени сомнения обозвал кодовый поток процессом)
  • Anatoly Podgoretsky © (19.11.10 20:54) [9]

    > Константин   (19.11.10 11:15) [6]

    Тогда зачем ты используешь классы, работай с WinSock API
  • Константн (02.12.10 12:41) [10]
    Действительно, чтобы сокет работал в отдельном потоке, нужно использовать только 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); и ждет, когда там что-то появится. Как правильно обработать подобный сбой?
  • Сергей М. © (02.12.10 21:18) [11]

    > чтобы сокет работал в отдельном потоке, нужно использовать
    > только WinSock


    Бред сивой кобылы.
    С тем же замечательным успехом можно использовать и широкоизвестные дельфийские классы, инкапсулирующие винсок-потроха.
 
Конференция "Сети" » Добавить Socket в поток, ошибка. [D7, WinXP]
Есть новые Нет новых   [134436   +24][b:0][p:0]