![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
|||
|
|||
|
Помогите при компиляции, выдает ошибку на строчку.
Код:
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
|
||||
|
||||
|
1. метод ClientSocketRead должен быть методом класса потока
2. более важное. а зачем использовать асинхронный (неблокируемый) сокет в потоке? |
|
#3
|
|||
|
|||
|
Переделал, но все равно выдает ошибку.
[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
|
||||
|
||||
|
Цитата:
Код:
procedure TMyThread.ClientSocketRead(Sender: TObject; Socket: TCustomWinSocket); begin end; Цитата:
В случае с асинхронными сокетами сразу выделяется отдельный поток, в котором работает вся сетевая часть. А взаимодействие с программой происходит через вызовы т.н. "каллбэков", которые (при правильном построении кода) совершенно не мешают основной программе. Именно поэтому использование асинхронных сокетов в потоке не то, что бы "неправильно", а просто бессмысленно... |
| Этот пользователь сказал Спасибо PhoeniX за это полезное сообщение: | ||
alanatolich (27.12.2013)
| ||
|
#5
|
|||
|
|||
|
Я в программе планирую отправлять/принимать данные на N-е количество компьютеров, через сокеты.
В основном цикле патока должны постоянно формироваться разные данные, для каждого удаленного компьютера, и отправляться через сокеты, причем разные объемы данных, для разных компьютеров. То есть основной цикл потока будет готовить данные и распихивать порции данных по сокетам, а сокеты будут отправлять и получать данные с удаленных компьютеров. Надеюсь понятно изложил. В данном случаи асинхронные сокеты более подойдут? |
|
#6
|
||||
|
||||
|
Цитата:
|