| 
| 
 | Вопрос # 5 860/ вопрос открыт / | 
 |  Здравствуйте, эксперты! возникла проблема при использовании сокетов и многопоточности, в потоке происход авторизация, сбор данніх после чего конеект на сервер с помощью сокета ,но в єтом то и проблема что коннект не происходит ,ранее когда потоки не использовал всё біло ок ,а теперь такое , подскажите что делать 
|  |   Вопрос задал: Alexsan (статус: Посетитель)Вопрос отправлен: 2 января 2012, 21:57
 Состояние вопроса: открыт, ответов: 0.
 |  
 Мини-форум вопросаВсего сообщений: 9; последнее сообщение — 3 января 2012, 17:18; участников в обсуждении: 3. 
|   | Вадим К (статус: Академик), 2 января 2012, 23:25 [#1]:Ну так расскажите, какие сокеты используете, как именно, какие компоненты. Ну и тому подобное. А то угадать сложно по такому описанию. Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Alexsan (статус: Посетитель), 2 января 2012, 23:38 [#2]:используется компонент clientSocket , так же используется таблицы из которой берутся данные с которыми после в потоке запускается юнит с процедурами. Конект клиент соккера происходит при использовании следуйщецй процедуры 
 procedure TBot.Sell;
begin
  Sock.Active := True;
  Status('Вход в игру...');
  Sock.Socket.Connect(1);
  TextToSend := 'LOGIN|'+ID+'|'+SID+'|'+Main.Edit1.Text+#10#00'PNG'#10#00;
  SendToServer(TextToSend);
  PNG.Enabled := True;
  Sleep(200);
  SendToServer('LAB|UPD|GET'#10#00);
  Sleep(200);
  SendToServer('RDY|MAP'#10#00);
  Sleep(2000);
end;но в том то и проблема что при использовании потоков в на сервер не входит , без потоков всё отлично работает , вроде всё описал ,жду советов
 |  
|   | bugmenot (статус: 3-ий класс), 3 января 2012, 12:17 [#3]:хех, вызовы Sleep уже внушают виконання програми розпочинається з того самого мiсця, де призупинилося.
 
 |  
|   | Alexsan (статус: Посетитель), 3 января 2012, 12:28 [#4]:такой формат входа тоже не работает 
 procedure TPB.LoginToGame;
begin
  Add('Вход в игру...');
  Sock.Address := MapIp;
  Sock.Host := MapIp;
  Sock.Active := True;
  FTextToSend := 'LOGIN|'+ID+'|'+SID+'|'+Edit7.Text+#10#00'PNG'#10#00;
  Sock.Socket.Write(1);
  PNG.Enabled := True;
  ForMove.Enabled := True;
end; |  
|   | Вадим К (статус: Академик), 3 января 2012, 13:41 [#5]:У Вас стиль сокетов да и кода какой? Многопоточности нет, да и код будет работать скорее всего лишь по одной причине - сервер будет успевать ответить за те 200мс, которые ему дали. Если сокеты блокирующие, тогда Sleep конечно не нужен, но программа будет заметно подвисать. Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Alexsan (статус: Посетитель), 3 января 2012, 13:53 [#6]:поток реализуется так 
 procedure TrBot.Execute;
begin
  try
    Runs[Ind] := True;
    Bot := TBot.Create;
    Bot.Nick := Main.Accs.Items[Ind].Caption;
    Bot.Pass := Main.Accs.Items[Ind].SubItems[0];
    Bot.Srv := Main.Accs.Items[Ind].SubItems[1];
    Bot.Index := Ind;
    Bot.StartBot;
  except
    Runs[Ind] := False;
    MessageBox(0,'Ошибка при потоке!','DOF',MB_OK+MB_ICONERROR);
  end;
end;Bot.StartBot; запускает юнит с кодом авторизауии и подключением на сервер на самом юните к которому подключаюсь висити такой код сокета
 Sock := TClientSocket.Create(nil);
  Sock.ClientType := ctNonBlocking;
  Sock.Port := 8080;
  Sock := Main.clSOck;
  Sock.OnRead := SocketRead;
  Sock.OnWrite := SocketWrite; |  
|   | Вадим К (статус: Академик), 3 января 2012, 16:50 [#7]:Так не будет работать. Если используется неблокирущий режим, а TClientSocket не привязан к форме (а у Вас там nil), то компонент работать не сможет. Ему нужна очередь сообщений (в неблокирующем режиме). А ее может дать только размещение компонента на форме.
 
 Вывод прост - либо неблокирующий режим и на главной форме, либо блокирующий и в треде.
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Alexsan (статус: Посетитель), 3 января 2012, 16:57 [#8]:чёт я не очень понял о чём вы можете просто написать поправку к моему коду? |  
|   | Вадим К (статус: Академик), 3 января 2012, 17:18 [#9]:"Написать поправку" в данном случае значит переписать с нуля. Галочка "подтверждения прочтения" - вселенское зло. |  3 января 2012, 20:57: Вопрос перемещён из тематического раздела Delphi » Общие вопросы по программированию в раздел Delphi » Работа с сетями и протоколами модератором Ерёмин А.А. Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |