Форум: "Сети";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];
ВнизTClientSocket в консольном приложении Найти похожие ветки
← →
pave (2004-03-15 09:30) [0]Уважаемые!
Поскажите, почему TClientSocket не работает в консольном приложении. В чём причина.
← →
pave (2004-03-15 09:30) [0]Уважаемые!
Поскажите, почему TClientSocket не работает в консольном приложении. В чём причина.
← →
BiN © (2004-03-15 09:35) [1]в потоке, где создается TClientSocket, конечно же, нет цикла обработки оконных сообщений?
← →
BiN © (2004-03-15 09:35) [1]в потоке, где создается TClientSocket, конечно же, нет цикла обработки оконных сообщений?
← →
pave (2004-03-15 09:43) [2]Не понял.
← →
pave (2004-03-15 09:43) [2]Не понял.
← →
BiN © (2004-03-15 09:48) [3]в потоке, в кот. ты создаешь экземпляр TClientSocket, должен находится цикл обрабртки входящих оконных сообщений. Пример такого цикла есть в методе ProcessMessage класса TApplication.
← →
BiN © (2004-03-15 09:48) [3]в потоке, в кот. ты создаешь экземпляр TClientSocket, должен находится цикл обрабртки входящих оконных сообщений. Пример такого цикла есть в методе ProcessMessage класса TApplication.
← →
pave (2004-03-15 10:22) [4]Можно по подробней.
function TCustomWinSocket.GetHandle: HWnd;
begin
if FHandle = 0 then
FHandle := AllocateHwnd(WndProc);
Result := FHandle;
end;
Зачем TClientSocket нужен "цикл обработки оконных сообщений"
← →
pave (2004-03-15 10:22) [4]Можно по подробней.
function TCustomWinSocket.GetHandle: HWnd;
begin
if FHandle = 0 then
FHandle := AllocateHwnd(WndProc);
Result := FHandle;
end;
Зачем TClientSocket нужен "цикл обработки оконных сообщений"
← →
Digitman © (2004-03-15 10:32) [5]затем чтобы в нужный момент времени вызывалась оконная процедура WndProc окна, создаваемого при вызове Gethandle
← →
Digitman © (2004-03-15 10:32) [5]затем чтобы в нужный момент времени вызывалась оконная процедура WndProc окна, создаваемого при вызове Gethandle
← →
pave (2004-03-15 10:48) [6]Создаю, что-то подобное:
CreateWindow("MyClass","MyWndow",WS_POPUP,0,0,0,0,0,hInstance,nil);
function WndProc(Window : hWnd; Msg,WParam, LParam : Integer): Integer; StdCall;
begin
Result := 0;
Case Msg of
WM_NCCREATE : Result:= 1;
WM_DESTROY : PostQuitMessage(0);
else Result:= DefWindowProc(Window,Msg,WParam,LParam);
end;
end;
А что дальше? Куда сунуть TClientSiocket?
← →
pave (2004-03-15 10:48) [6]Создаю, что-то подобное:
CreateWindow("MyClass","MyWndow",WS_POPUP,0,0,0,0,0,hInstance,nil);
function WndProc(Window : hWnd; Msg,WParam, LParam : Integer): Integer; StdCall;
begin
Result := 0;
Case Msg of
WM_NCCREATE : Result:= 1;
WM_DESTROY : PostQuitMessage(0);
else Result:= DefWindowProc(Window,Msg,WParam,LParam);
end;
end;
А что дальше? Куда сунуть TClientSiocket?
← →
BiN © (2004-03-15 10:55) [7]ему про Фому, а он про Ерему...
так ка у тебя консольное приложение, то скорее всего тебе нужно разнести функции ввода/вывода и работу с сокетами в разные потоки. В одном из них и должна идти обработка типа
repeat
if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end
until ...
там же и должен быть создан твой сокет. Всё.
← →
BiN © (2004-03-15 10:55) [7]ему про Фому, а он про Ерему...
так ка у тебя консольное приложение, то скорее всего тебе нужно разнести функции ввода/вывода и работу с сокетами в разные потоки. В одном из них и должна идти обработка типа
repeat
if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end
until ...
там же и должен быть создан твой сокет. Всё.
← →
Digitman © (2004-03-15 10:59) [8]
> Создаю, что-то подобное
.. но не имеющее ничего общего с циклом выборки-диспетчеризации сообщений ... который выглядит гораздо проще
var
Msg: TMsg;
...
//здесь создаем объект TClientSocket, инициализируем его для работы в режиме ctNonBlocking,
//назначаем нужные обработчики его событий
//и активизируем его вызовом Open()
//следом же должен идти собственно упомянутый цикл
while GetMessage(Msg, 0, 0, 0) do //ждем и выбираем из очереди оконных сообщений любые поступающие сообщения, выход из цикла - по поступлению сообщения WM_QUIT
DispatchMessage(Msg); //диспетчеризуем сообщения, в рез-те чего вызываются нужные оконные процедуры существующих окон, созданных текущим кодовым потоком
← →
Digitman © (2004-03-15 10:59) [8]
> Создаю, что-то подобное
.. но не имеющее ничего общего с циклом выборки-диспетчеризации сообщений ... который выглядит гораздо проще
var
Msg: TMsg;
...
//здесь создаем объект TClientSocket, инициализируем его для работы в режиме ctNonBlocking,
//назначаем нужные обработчики его событий
//и активизируем его вызовом Open()
//следом же должен идти собственно упомянутый цикл
while GetMessage(Msg, 0, 0, 0) do //ждем и выбираем из очереди оконных сообщений любые поступающие сообщения, выход из цикла - по поступлению сообщения WM_QUIT
DispatchMessage(Msg); //диспетчеризуем сообщения, в рез-те чего вызываются нужные оконные процедуры существующих окон, созданных текущим кодовым потоком
← →
Digitman © (2004-03-15 11:02) [9]
> BiN
в консольном приложении TranslateMessage() необязателен - совершенно лишний и бестолковый вызов
← →
Digitman © (2004-03-15 11:02) [9]
> BiN
в консольном приложении TranslateMessage() необязателен - совершенно лишний и бестолковый вызов
← →
BiN © (2004-03-15 11:09) [10]Digitman © (15.03.04 11:02) [9]
автор в посте [6] вроде создает свои окна. Так что в общем случае TranslateMessage не является таким уж "совершенно лишним и бестолковым вызовом". Хотя, конечно, если не будут использоваться окна как инструменты ввода информации, вызов данной функции теряет смысл.
← →
BiN © (2004-03-15 11:09) [10]Digitman © (15.03.04 11:02) [9]
автор в посте [6] вроде создает свои окна. Так что в общем случае TranslateMessage не является таким уж "совершенно лишним и бестолковым вызовом". Хотя, конечно, если не будут использоваться окна как инструменты ввода информации, вызов данной функции теряет смысл.
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.034 c