Модераторы: volvo877, Snowy, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Консольный сервер, Многопоточное консольное приложение 
:(
    Опции темы
Lonser
Дата 27.4.2006, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 27.4.2006

Репутация: нет
Всего: нет



Всем привет ! Подскажите пожалуйста, как реализовать idUDPServer в консольном приложении ? Вся проблема в Events -> OnUDPRead, то есть как зделать чтобы сервер в каждый момент времяни слушал порт и принимал пришедшие сообщения ; ну и выводил их на экран. Заранее благодарен. 
PM MAIL   Вверх
Snowy
Дата 27.4.2006, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: нет
Всего: 484



Не совсем ясно в чем проблема.
Обычное динамическое создание.
Создаешь сервер, назначаешь ему событие...
Разница только в том, что событие нужно прописать ручками, а не мышой.
Это делается одинаково, что в дельфи, что в кайликсе. Для любых объектов. 
PM MAIL   Вверх
Lonser
Дата 28.4.2006, 01:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 27.4.2006

Репутация: нет
Всего: нет



Ну я собсно так и делаю, динамически создаю объект idUDPServer, ручками а не мышкой назначаю ему событие... но когда приходит UDP сообщение ничего не происходит... Вот посмотрите может что неправельно делаю ? Может надо OnUDPRead как-нибудь отдельным потоком запустить ?
Код

program Project1;

{$APPTYPE CONSOLE}

uses
    SysUtils,  Types,  Classes, Variants, QGraphics, QControls,
  QDialogs, QStdCtrls, IdUDPServer, IdBaseComponent,
  IdComponent, IdUDPBase, IdUDPClient, IdSocketHandle;

Type
 server = class(TidUDPServer)
 public
  Procedure UDPRead(Sender: TObject; AData: TStream;
  ABinding: TIdSocketHandle);
end;

Var
se:server;

{ server }

procedure server.UDPRead(Sender: TObject; AData: TStream;
  ABinding: TIdSocketHandle);
Var
SFS:TstringStream;
s:string;
begin
 SFS:=TStringStream.create('');
 SFS.CopyFrom(AData, AData.Size);
 Writeln(ABinding.PeerIP+' '+SFS.DataString);
 ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, s[1], Length(s));
 SFS.Free;
end;

begin
 se:=server.Create(nil);
 se.DefaultPort:=11254;
 se.BufferSize:=8192;
 se.BroadcastEnabled:=true;
 se.Active:=true;
 se.OnUDPRead:=se.UDPRead;
readln;
 se.Free;
  { TODO -oUser -cConsole Main : Insert code here }
end.

p.s. uses`ов побольше подключил на всякий случай : потом буду убивать ненужные. 
PM MAIL   Вверх
Snowy
Дата 28.4.2006, 08:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: нет
Всего: 484



Цитата(Lonser @  28.4.2006,  01:03 Найти цитируемый пост)
 QGraphics, QControls,  QDialogs, QStdCtrls
Это сразу убирай, если хочешь, чтобы сервер был но-настоящему консольный. Т.е. мог работать без гуёв.

Цитата(Lonser @  28.4.2006,  01:03 Найти цитируемый пост)
 se.Active:=true;    
 se.OnUDPRead:=se.UDPRead;
Это поменяй местами. Сначала нужно присвоить все параметры, а потом активировать сервис.


Цитата(Lonser @  28.4.2006,  01:03 Найти цитируемый пост)
readln;
А вот в этом проблема.
Создай переменную, например:
Код
var ExitFlag: boolean = false;
А вместо ReadLn напиши:
Код
  repeat
    Sleep(1000); // пассивно отдыхаем 1 секунду, чтобы не создавать нагрузки
    // .... здесь можешь прописать другие действия. Например проверку состояния клавиши Esc.
  until ExitFlag;
Для выхода из программы, нужно установить ExitFlag в true. Устанавливай ее по комманде пришедшей в порт или по нажатию волшебной кнопки, ну или еще как - смотри сам. 
PM MAIL   Вверх
Lonser
Дата 28.4.2006, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 27.4.2006

Репутация: нет
Всего: нет



Спасибо большое, только
Цитата(Snowy @  28.4.2006,  08:34 Найти цитируемый пост)
Код
  repeat
    Sleep(1000); // пассивно отдыхаем 1 секунду, чтобы не создавать нагрузки
    // .... здесь можешь прописать другие действия. Например проверку состояния клавиши Esc.
  until ExitFlag;
Для выхода из программы, нужно установить ExitFlag в true. Устанавливай ее по комманде пришедшей в порт или по нажатию волшебной кнопки, ну или еще как - смотри сам.

Закрывать по комманде пришедшей в порт : с этим проблем нет, а как отслеживать нажатие клавиши ? Помнится в pascal`е была замечательныя функция keypressed модуля CRT, может быть здесь есть какой-нибудь аналог ? 
PM MAIL   Вверх
Snowy
Дата 28.4.2006, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: нет
Всего: 484



Честно говоря, сейчас даже не подскажу.
Кайликса под рукой нет.
Есть FreePascal, но там все просто - keypressed существует.
По идее должно быть что-то вроде
keyboard.GetKeyState()
но точно не скажу. 
PM MAIL   Вверх
Lonser
Дата 28.4.2006, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 27.4.2006

Репутация: нет
Всего: нет



Сообщение удалено пользователем 

Это сообщение отредактировал(а) Lonser - 28.4.2006, 15:58
PM MAIL   Вверх
Snowy
Дата 28.4.2006, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: нет
Всего: 484



Перед se.Active := true нужно добавить строчку:
Код
  se.ThreadedEvent := True;
Иначе тред соединения будет пытаться осуществить синхронизацию, а мы спим... 
PM MAIL   Вверх
Lonser
Дата 28.4.2006, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 27.4.2006

Репутация: нет
Всего: нет



Ага, точно ! Спасибо огромное !!! 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi"
THandle
Rrader
volvo877

Запрещается!

1. Обсуждать и делится взломанными компонентами или программным обеспечением

2. Публиковать ссылки на варез

3. Оффтопить

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, THandle, Rrader, volvo877.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Object Pascal: кроссплатформенные технологии | Следующая тема »


 




[ Время генерации скрипта: 0.0489 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.