![]() |
|
|
Регистрация | << Правила форума >> | 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; Цитата:
В случае с асинхронными сокетами сразу выделяется отдельный поток, в котором работает вся сетевая часть. А взаимодействие с программой происходит через вызовы т.н. "каллбэков", которые (при правильном построении кода) совершенно не мешают основной программе. Именно поэтому использование асинхронных сокетов в потоке не то, что бы "неправильно", а просто бессмысленно... Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
Этот пользователь сказал Спасибо 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)
|