![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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
|
||||
|
||||
|
Цитата:
|
|
#7
|
|||
|
|||
|
Эх, опять не хочет компилироваться
Код:
unit mypotok;
interface
uses
ScktComp,
Classes,SysUtils, ADODB,ActiveX;
type
TMyThread = class(TThread)
// данные из сокета
procedure ClientSocketRead(Sender: TObject; Socket: TCustomWinSocket);
// соеденение
procedure ClientSocketConnect(Sender: TObject; Socket: TCustomWinSocket);
private
{ Private declarations }
protected
procedure Execute; override;
end;
var MYClientSocket:TClientSocket;
implementation
uses unit1;
procedure TMyThread.ClientSocketConnect(Sender: TObject; Socket: TCustomWinSocket);
begin
Socket.SendText('test ');
end;
procedure TMyThread.ClientSocketRead(Sender: TObject; Socket: TCustomWinSocket);
begin
end;
procedure TMyThread.Execute;
I: Integer;
myList:TList;
const NumberClientSocket=1;
begin
// создаем список
MYList := TList.Create;
// создаем сокеты
for I :=0 to NumberClientSocket do
begin
MYClientSocket:=TClientSocket.Create(nil);
MYClientSocket.OnRead:=TMyThread.ClientSocketRead;
MYClientSocket.OnConnect:=TMyThread.ClientSocketConnect;
MYClientSocket.Name:='MS'+inttostr(I);
MYList.Add(MYClientSocket);
end;
// прописываем IP сокету последнего терминала в списке
TClientSocket(myList[0]).Address:=terminalip(termial[termial.Count-1-I]);
// прописываем порт
TClientSocket(myList[0]).port:=55555;
// соеденяемся
TClientSocket(myList[0]).Open;
while True do
begin
end;
// освобождаем сокеты
for I :=0 to NumberClientSocket do
begin
TClientSocket(myList[i]).Close;
TClientSocket(myList[i]).Free;
end;
// освобождаем список
termial.Free;
end;
end.ошибка на строчках Код:
MYClientSocket.OnRead:=TMyThread.ClientSocketRead; Код:
MYClientSocket.OnConnect:=TMyThread.ClientSocketConnect; [DCC Error] mypotok.pas(111): E2010 Incompatible types: 'TSocketNotifyEvent' and 'Procedure' [DCC Error] mypotok.pas(112): E2010 Incompatible types: 'TSocketNotifyEvent' and 'Procedure' Как правильно присвоить обработчики? |
|
#8
|
||||
|
||||
|
Цитата:
|
|
#9
|
|||
|
|||
|
Цитата:
Код:
procedure TMyThread.ClientSocketConnect(Sender: TObject; Socket: TCustomWinSocket);
begin
Socket.SendText('test ');
end; в чем причина не пойму![]() |
|
#10
|
||||
|
||||
|
Цитата:
Код:
while True do
begin
end;Код:
procedure TMyThread.Execute;
.....
var
Msg: TMsg;
begin
.....
// создаем сокеты
.....
while not Terminated do
begin
if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end;
.....
// освобождаем сокеты
.....
end; |
|
#11
|
|||
|
|||
|
poli-smen большое спасибо.
добавил в цикл Код:
if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;все заработало. Объясните пожалуйста эти три процедуры Код:
PeekMessage TranslateMessage DispatchMessage PeekMessage - я понял, что она проверяет есть ли в очереди сообщение, а вот две другие, не понял, за объяснение буду очень благодарен |
|
#12
|
||||
|
||||
|
Цитата:
Вот новый вариант цикла обработки сообщений: Код:
while not Terminated do
begin
if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then DispatchMessage(Msg) else Sleep(100);
end; |
|
#13
|
|||
|
|||
|
poli-smen
Вот интересный момент Цитата:
у меня приложение без оконное (служба), запускающее отдельный поток работы с сокетами. Я не верно что то понимаю, что имеется в виду под словами оконная процедура |
|
#14
|
||||
|
||||
|
Цитата:
Вот в этом куске кода из стандартного модуля ScktComp и создаётся это окно: Код:
function TCustomWinSocket.GetHandle: HWnd;
begin
if FHandle = 0 then
FHandle := AllocateHwnd(WndProc);
Result := FHandle;
end; |
| Этот пользователь сказал Спасибо poli-smen за это полезное сообщение: | ||
alanatolich (09.01.2014)
| ||