Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 860

/ вопрос открыт /

Здравствуйте, эксперты! возникла проблема при использовании сокетов и многопоточности, в потоке происход авторизация, сбор данніх после чего конеект на сервер с помощью сокета ,но в єтом то и проблема что коннект не происходит ,ранее когда потоки не использовал всё біло ок ,а теперь такое , подскажите что делать

Alexsan Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Alexsan (статус: Посетитель)
Вопрос отправлен: 2 января 2012, 21:57
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 9; последнее сообщение — 3 января 2012, 17:18; участников в обсуждении: 3.
Вадим К

Вадим К (статус: Академик), 2 января 2012, 23:25 [#1]:

Ну так расскажите, какие сокеты используете, как именно, какие компоненты. Ну и тому подобное. А то угадать сложно по такому описанию.
Галочка "подтверждения прочтения" - вселенское зло.
Alexsan

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

bugmenot (статус: 3-ий класс), 3 января 2012, 12:17 [#3]:

хех, вызовы Sleep уже внушают
виконання програми розпочинається з того самого мiсця, де призупинилося.

Alexsan

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

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

Alexsan (статус: Посетитель), 3 января 2012, 16:57 [#8]:

чёт я не очень понял о чём вы можете просто написать поправку к моему коду?
Вадим К

Вадим К (статус: Академик), 3 января 2012, 17:18 [#9]:

"Написать поправку" в данном случае значит переписать с нуля.
Галочка "подтверждения прочтения" - вселенское зло.

3 января 2012, 20:57: Вопрос перемещён из тематического раздела Delphi » Общие вопросы по программированию в раздел Delphi » Работа с сетями и протоколами модератором Ерёмин А.А.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:35
Выполнено за 0.03 сек.