Ir para conteúdo
Fórum Script Brasil
  • 0

ClientSocket & Threads


Dolfin

Pergunta

Pessoal, é o seguinte... Eu estou trabalhando com o componente ClientSocket e Threads, e para cada thread, eu crio uma nova instância de um Socket com o seguinte código:

procedure Threads.Execute;
begin
  Application.ProcessMessages;
  ClientSocket:= TClientSocket.Create(Application); //criando o socket
  ClientSocket.Port:= 81; //setando a porta para conexao
  ClientSocket.OnConnect:= OnConnect; //setando evento onconnect
  ClientSocket.OnRead:= OnRead; //setando evento onread
  ClientSocket.OnDisconnect:= OnDisconnect; //setando evento ondisconnect
  ClientSocket.Host:= HLine; //lendo o host de um TXT
end;

Aonde:

ClientSocket é uma variável privada da thread

HLine aonde eu seto o Host, é uma variável que eu pego de uma linha de um TXT com servidores para conexão.

O problema é:

Com esse código eu achei que criava 1 socket por thread, e setava o Host do Socket para a linha atual que estaria lendo o TXT, e isso até funciona em partes... Ele abre as conexões com cada linha lida do TXT, porém num determinado momento, eu preciso fechar a conexão... E abri-la novamente mais tarde, e aí eu notei o seguinte:

A propriedade Host do ClientSocket está sempre ficando com apenas 1 servidor... Ele não tá gravando cada ClientSocket de cada Thread com um Host, ele pega sempre o último o Host e seta como se fosse para todos... Como eu posso fazer para que cada thread tenha seu socket e cada socket tenha seu Host, para que eu possa abrir, fechar, re-abrir conexões, cada socket com seu host?

Link para o comentário
Compartilhar em outros sites

3 respostass a esta questão

Posts Recomendados

  • 0

O que tá rolando aqui é:

eu tenho um componente OpenTextDialog que abre o TXT com endereços IP dos servidores para conexão... Cada thread cria um socket, cada socket conecta em um IP... Isso tá funcionando, porém, a conexão fica aberta e se eu preciso fechar e abri-la novamente, o programa por algum motivo já perdeu a propriedade Host, e tenta abrir a conexão com último host setado(última linha lida do TXT de IPs)...

Vou colar o trecho que abre o TXT utilizando o OpenDialog:

procedure TForm1.Button1Click(Sender: TObject);
begin
  OpenTextFileDialog1.InitialDir:= ExtractFilePath(Application.ExeName);
 if (OpenTextFileDialog1.Execute) then
  begin
    AssignFile(HostsFile, OpenTextFileDialog1.FileName);
    Reset(HostsFile);
Esse código acima le o arquivo TXT e grava na variável HostsFile, aí eu chamo um procedure da Thread chamada ThreadsController, que controla o número de threads abertas pelo valor de um Edit ou pelo número de linhas do TXT, como segue abaixo:
procedure Threads.ThreadsController;
begin
 while ((StrToInt(Form1.Edit2.Text) > iThread) and (not eof(HostsFile))) do
  begin
   inc(iThread);
   Readln(HostsFile, HLine);
   Process:=Threads.Create(True);
   Sleep(10);
   UserController;
  end;
end;
Como pode ver, eu crio a Thread nessa procedure, e logo após a criação, ela é executada como segue a procedure:
procedure Threads.Execute;
begin
  Application.ProcessMessages;
  ClientSocket:= TClientSocket.Create(Application);
  ClientSocket.Port:= 81;
  ClientSocket.OnConnect:= OnConnect;
  ClientSocket.OnRead:= OnRead;
  ClientSocket.OnDisconnect:= OnDisconnect;
  ClientSocket.Host:= HLine;
end;
Bom, eu passo pela criação da Thread com sucesso para cada linha do TXT, ele abre cada thread para uma linha, cada socket com seu respectivo Host... O único problema é quando eu preciso fechar a conexão de alguma thread e re-abrir, porque aí a propriedade Host do ClientSocket já virou o último IP lido da lista... As threads não estão guardando essa propriedade do ClientSocket. A cada passada na Thread.Execute, as propriedades viram 'absolutas' e todos os ClientSockets de outras threads inclusive, ficam com a mesma propriedade parece... Lembrando que ClientSocket é uma variável privada da própria Thread, como mostro abaixo:
Threads= class(TThread)
private
  ClientSocket: TClientSocket;
  procedure ThreadsController;
  procedure UserController;
.....

Link para o comentário
Compartilhar em outros sites

  • 0

tenho um componente OpenTextDialog que abre o TXT com endereços IP dos servidores para conexão

sugestão:

utilize tambem um listbox para armazenar os endereços, dessa maneira se voce fechar a conexão e precisar abri-la novamente voce clica em um dos endereços que esta na listbox, fazendo com que a variavel HLine receba este novo valor

abraço

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,2k
×
×
  • Criar Novo...