![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TClientSocket в консольном приложении [D6, Win2k]
pave © (2004-03-15 09:30:00)Уважаемые!
Поскажите, почему TClientSocket не работает в консольном приложении. В чём причина.
BiN (2004-03-15 11:09:00) [1]Digitman © (15.03.04 11:02) [9]
автор в посте [6] вроде создает свои окна. Так что в общем случае TranslateMessage не является таким уж "совершенно лишним и бестолковым вызовом". Хотя, конечно, если не будут использоваться окна как инструменты ввода информации, вызов данной функции теряет смысл.
Digitman (2004-03-15 11:02:00) [2]
> BiN
в консольном приложении TranslateMessage() необязателен - совершенно лишний и бестолковый вызов
Digitman (2004-03-15 10:59:00) [3]
> Создаю, что-то подобное
.. но не имеющее ничего общего с циклом выборки-диспетчеризации сообщений ... который выглядит гораздо проще
var
Msg: TMsg;
...
//здесь создаем объект TClientSocket, инициализируем его для работы в режиме ctNonBlocking,
//назначаем нужные обработчики его событий
//и активизируем его вызовом Open()
//следом же должен идти собственно упомянутый цикл
while GetMessage(Msg, 0, 0, 0) do //ждем и выбираем из очереди оконных сообщений любые поступающие сообщения, выход из цикла - по поступлению сообщения WM_QUIT
DispatchMessage(Msg); //диспетчеризуем сообщения, в рез-те чего вызываются нужные оконные процедуры существующих окон, созданных текущим кодовым потоком
BiN (2004-03-15 10:55:00) [4]ему про Фому, а он про Ерему...
так ка у тебя консольное приложение, то скорее всего тебе нужно разнести функции ввода/вывода и работу с сокетами в разные потоки. В одном из них и должна идти обработка типа
repeat
if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end
until ...
там же и должен быть создан твой сокет. Всё.
pave (2004-03-15 10:48:00) [5]Создаю, что-то подобное:
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?
Digitman (2004-03-15 10:32:00) [6]затем чтобы в нужный момент времени вызывалась оконная процедура WndProc окна, создаваемого при вызове Gethandle
pave (2004-03-15 10:22:00) [7]Можно по подробней.
function TCustomWinSocket.GetHandle: HWnd;
begin
if FHandle = 0 then
FHandle := AllocateHwnd(WndProc);
Result := FHandle;
end;
Зачем TClientSocket нужен "цикл обработки оконных сообщений"
BiN (2004-03-15 09:48:00) [8]в потоке, в кот. ты создаешь экземпляр TClientSocket, должен находится цикл обрабртки входящих оконных сообщений. Пример такого цикла есть в методе ProcessMessage класса TApplication.
pave (2004-03-15 09:43:00) [9]Не понял.
BiN (2004-03-15 09:35:00) [10]в потоке, где создается TClientSocket, конечно же, нет цикла обработки оконных сообщений?