Главная страница
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.127 c
7-1075732685
M@Rt
2004-02-02 17:38
2004.04.11
Определение серийного номера материнской платы


1-1082651430
Canpek
2004-04-22 20:30
2004.04.11
Запрос совета


14-1082011916
LaidBack
2004-04-15 10:51
2004.04.11
Люди! Вышлите мне файл таблицы *.tps, пожалуйста!


1-1080115148
Question2004
2004-03-24 10:59
2004.04.11
Замена слов


11-1060871472
Мякс
2003-08-14 18:31
2004.04.11
TabControl