Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 26.12.2013, 16:57
alanatolich alanatolich вне форума
Прохожий
 
Регистрация: 24.12.2013
Сообщения: 18
Версия Delphi: Delphi XE
Репутация: 10
По умолчанию динамическое создание сокетов в потоке

Помогите при компиляции, выдает ошибку на строчку.

Код:
MYClientSocket.OnRead:=ClientSocketRead;

[DCC Error] mypotok.pas(81): E2009 Incompatible types: 'method pointer and regular procedure'

Как правильно обработать события от созданных сокетах?




Код:
unit mypotok;

interface

uses
  ScktComp,
  Classes,SysUtils, ADODB,ActiveX;
  
    // данные из сокета
    procedure ClientSocketRead(Sender: TObject; Socket: TCustomWinSocket);
type
  TMyThread = class(TThread)
  private
    { Private declarations }
  protected
    procedure Execute; override;
  end;


var MYClientSocket:TClientSocket;

implementation


procedure ClientSocketRead(Sender: TObject; Socket: TCustomWinSocket);
begin
	{}
end;

procedure TMyThread.Execute;
var termial:TStringList;
  I: Integer;
    myList:TList;
const NumberClientSocket=1;

begin
    // создаем список
    MYList := TList.Create;
    // создаем сокеты
    for I :=0 to NumberClientSocket do
    begin
        MYClientSocket:=TClientSocket.Create(nil);
        MYClientSocket.OnRead:=ClientSocketRead;
        MYClientSocket.Name:='MS'+inttostr(I);
        MYList.Add(MYClientSocket);
    end;
    // основной цикл потока
    while True do
    begin
        TClientSocket(myList[i]).Address:=terminalip('127.0.0.1');
        TClientSocket(myList[i]).port:=55555;
        TClientSocket(myList[i]).Open;
    end;
    // освобождаем сокеты
    for I :=0 to NumberClientSocket do
    begin
        TClientSocket(myList[i]).Close;
        TClientSocket(myList[i]).Free;
    end;
    // освобождаем список
    termial.Free;
end;

end.

Последний раз редактировалось alanatolich, 26.12.2013 в 17:35.
Ответить с цитированием
  #2  
Старый 26.12.2013, 17:46
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

1. метод ClientSocketRead должен быть методом класса потока
2. более важное. а зачем использовать асинхронный (неблокируемый) сокет в потоке?
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #3  
Старый 27.12.2013, 09:31
alanatolich alanatolich вне форума
Прохожий
 
Регистрация: 24.12.2013
Сообщения: 18
Версия Delphi: Delphi XE
Репутация: 10
По умолчанию

Переделал, но все равно выдает ошибку.

[DCC Error] mypotok.pas(16): E2065 Unsatisfied forward or external declaration: 'TMyThread.ClientSocketRead'

на строку

Код:
    procedure ClientSocketRead(Sender: TObject; Socket: TCustomWinSocket);

Приведите пожалуйста пример как правильно.

Код:
unit mypotok;

interface

uses
  ScktComp,
  Classes,SysUtils, ADODB,ActiveX;

type
  TMyThread = class(TThread)

    // данные из сокета
    procedure ClientSocketRead(Sender: TObject; Socket: TCustomWinSocket);

  private
    { Private declarations }
  protected
    procedure Execute; override;
  end;


var MYClientSocket:TClientSocket;

implementation


procedure ClientSocketRead(Sender: TObject; Socket: TCustomWinSocket);
begin

end;

procedure TMyThread.Execute;
var termial:TStringList;
  I: Integer;
    myList:TList;
const NumberClientSocket=1;

begin
    // создаем список
    MYList := TList.Create;
    // получаем список терминалов на загрузки
    termial:=terminals('loading');
    //
    // создаем сокеты
    for I :=0 to NumberClientSocket do
    begin
        MYClientSocket:=TClientSocket.Create(nil);
        MYClientSocket.OnRead:=ClientSocketRead;
        MYClientSocket.Name:='MS'+inttostr(I);
        MYList.Add(MYClientSocket);
    end;
    // основной цикл потока
    while True do
    begin
        TClientSocket(myList[0]).Address:=terminalip('127.0.0.1');
        TClientSocket(myList[0]).port:=55555;
        TClientSocket(myList[0]).Open;
    end;
    // освобождаем сокеты
    for I :=0 to NumberClientSocket do
    begin
        TClientSocket(myList[i]).Close;
        TClientSocket(myList[i]).Free;
    end;
    // освобождаем список
    termial.Free;
end;

end.

Расскажите что представляют из себя асинхронный (неблокируемый)/синхронный (блокируемый) сокет.

Расскажите в чем разница использования асинхронный (неблокируемый)/синхронный (блокируемый) сокет.

Почему не правильно использовать асинхронный (неблокируемый) сокет в потоке?

За информацию буду очень благодарен
Ответить с цитированием
  #4  
Старый 27.12.2013, 09:50
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Цитата:
Сообщение от alanatolich
Переделал, но все равно выдает ошибку.

[DCC Error] mypotok.pas(16): E2065 Unsatisfied forward or external declaration: 'TMyThread.ClientSocketRead'
Тебе надо переписать объявление процедуры ниже по коду. Метод класса должен "раскрываться" как-то так:
Код:
procedure TMyThread.ClientSocketRead(Sender: TObject; Socket: TCustomWinSocket);
begin
end;
Цитата:
Расскажите что представляют из себя асинхронный (неблокируемый)/синхронный (блокируемый) сокет. Расскажите в чем разница использования асинхронный (неблокируемый)/синхронный (блокируемый) сокет. Почему не правильно использовать асинхронный (неблокируемый) сокет в потоке?
Всё просто. Синхронный выполняется в одном потоке с программой, что приводит к тому, что при работе с этим сокетом программа "подвисает". Оно и понятно - пока не отработает часть с сокетами, для самой программы ресурсов выделять никто не будет.
В случае с асинхронными сокетами сразу выделяется отдельный поток, в котором работает вся сетевая часть. А взаимодействие с программой происходит через вызовы т.н. "каллбэков", которые (при правильном построении кода) совершенно не мешают основной программе. Именно поэтому использование асинхронных сокетов в потоке не то, что бы "неправильно", а просто бессмысленно...
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
Этот пользователь сказал Спасибо PhoeniX за это полезное сообщение:
alanatolich (27.12.2013)
  #5  
Старый 27.12.2013, 10:21
alanatolich alanatolich вне форума
Прохожий
 
Регистрация: 24.12.2013
Сообщения: 18
Версия Delphi: Delphi XE
Репутация: 10
По умолчанию

Я в программе планирую отправлять/принимать данные на N-е количество компьютеров, через сокеты.
В основном цикле патока должны постоянно формироваться разные данные, для каждого удаленного компьютера, и отправляться через сокеты, причем разные объемы данных, для разных компьютеров.
То есть основной цикл потока будет готовить данные и распихивать порции данных по сокетам, а сокеты будут отправлять и получать данные с удаленных компьютеров.

Надеюсь понятно изложил.

В данном случаи асинхронные сокеты более подойдут?
Ответить с цитированием
  #6  
Старый 27.12.2013, 10:38
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Цитата:
Сообщение от alanatolich
В данном случаи асинхронные сокеты более подойдут?
легко.....
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 06:12.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025