Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.11;
Скачать: CL | DM;

Вниз

TClientSocket в консольном приложении   Найти похожие ветки 

 
pave   (2004-03-15 09:30) [0]

Уважаемые!
Поскажите, почему TClientSocket не работает в консольном приложении. В чём причина.


 
BiN ©   (2004-03-15 09:35) [1]

в потоке, где создается TClientSocket, конечно же, нет цикла обработки оконных сообщений?


 
pave   (2004-03-15 09:43) [2]

Не понял.


 
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 нужен "цикл обработки оконных сообщений"


 
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?


 
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 11:02) [9]


> BiN


в консольном приложении TranslateMessage() необязателен - совершенно лишний и бестолковый вызов


 
BiN ©   (2004-03-15 11:09) [10]

Digitman ©   (15.03.04 11:02) [9]
автор в посте [6] вроде создает свои окна. Так что в общем случае TranslateMessage не является таким уж "совершенно лишним и бестолковым вызовом". Хотя, конечно, если не будут использоваться окна как инструменты ввода информации, вызов данной функции теряет смысл.



Страницы: 1 вся ветка

Текущий архив: 2004.04.11;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.048 c
1-1082447210
SerSar
2004-04-20 11:46
2004.04.11
Разрыв страницы в Excel


14-1082099661
Igorek
2004-04-16 11:14
2004.04.11
Есть идея - супер мотоцикл! Критикуйте!


7-1073743146
Angel_Forever
2004-01-10 16:59
2004.04.11
Quake & CS


14-1077529058
VictorT
2004-02-23 12:37
2004.04.11
Львовская встреча Дремучих & Мастаков


4-1075492150
mixrud
2004-01-30 22:49
2004.04.11
Как получить текущую область обновления рабочего стола