|
Вопрос # 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 » Работа с сетями и протоколами модератором Ерёмин А.А.
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|