Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.035 c
1-1080113098
cult
2004-03-24 10:24
2004.04.11
OFF: программы для просмотра и сравнения файлов


7-1080132722
Nestee
2004-03-24 15:52
2004.04.11
Пароль на rar архив


7-1075379231
*partizan*
2004-01-29 15:27
2004.04.11
Работа с регистром


1-1080197934
IceMaster
2004-03-25 09:58
2004.04.11
Как в фотошопе


3-1079090509
webmaster
2004-03-12 14:21
2004.04.11
MySql sever ...




   Наверх