![]() |
|
|
Регистрация | << Правила форума >> | 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
|
||||
|
||||
![]() Цитата:
Пишу программы за еду. __________________ |