Jump to content
Fórum Script Brasil
  • 0

ClientSocket & Threads


Dolfin

Question

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 to comment
Share on other sites

3 answers to this question

Recommended Posts

  • 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 to comment
Share on other 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 to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.2k
    • Total Posts
      652k
×
×
  • Create New...