Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

WSAWaitForMultipleEvents для однонитевого сервера [D6, XP]


Страницы:   1 2 3

Евгений07 ©   (2011-09-09 16:14:00) 

Уважаемые дельфийцы!
Есть ли примеры использования WSAWaitForMultipleEvents для запуска процедуры приема и обработке данных однонитевым  сервером от единственного клиента ( WinSock2 )
Событие об отправке данных серверу через PostMessage, были случаи, терялись.
Номер сообщения получен из RegisterWindowMessage.
Возможно, клиент и сервер будут на разных компах, тогда PostMessage отпадает.
Заводить процесс только для WSAWaitForMultipleEvents для единственного клиента сервера не хочется, нет практики, потребности и времени.
Как вариант есть еще таймер
Где посоветуете копать?


Евгений07   (2011-09-12 13:02:00) [21]

Для воспроизведения надо стороннюю прогу + моя ДЛЛ с клиентом + отладчик сервера

Пока проверил версию с потоком
WSAWaitForMultipleEvents Жрет > 50% ЦП  как и вариант с таймером

Это плохо, у меня на компе с интернетом еще 1 сервер

Вопрос: выводы верны?
1. сервер с потоком на WSAWaitForMultipleEvents жрет  > 50% ЦП
2. сервер с таймером жрет  > 50% ЦП

Сторонняя прога сидит в инете и принимает, обрабатывает несколько пачек инфы в секунду и ничего не жрет


Evgeny V   (2011-09-12 12:00:00) [22]


> Евгений07   (12.09.11 11:55) [22]


> Если щелкание кнопками сервера я могу сбить факт прихода
> сообщения клиента  этого не должно быть

Если ты щелканьем кнопки добиваешься потерь сообщений - это говорит только об ошибке в программе. Если это так легко воспроизводится- то код в студию.


Евгений07   (2011-09-12 11:55:00) [23]

Факты потери были. Несколько раз, плавающие
На отладочной форме был Мемо для трассировки и Чек для управлением объема отладки.
Если щелкание кнопками сервера я могу сбить факт прихода сообщения клиента  этого не должно быть


Evgeny V   (2011-09-12 11:03:00) [24]


> Евгений07   (12.09.11 10:30) [19]

1) Какое это имеет отношение к WSAAsyncSelect? Думаешь будут теряться сообщения?
2) Потери сообщений на совести логики твоей программы.


Evgeny V   (2011-09-12 11:03:00) [25]


> Евгений07   (12.09.11 10:30) [19]

1) Какое это имеет отношение к WSAAsyncSelect? Думаешь будут теряться сообщения?
2) Потери сообщений на совести логики твоей программы.


Евгений07   (2011-09-12 10:30:00) [26]

Evgeny V   (12.09.11 10:18) [18]

 WM_PewFor_Arx  := RegisterWindowMessage('WM_PewFor_Arx ');

procedure TForm1.WndProc(var Message: TMessage);            
 if Message.Msg = WM_PewFor_Arx then begin
    //обработка команда терминала FxPew = сервер
   // здесь были случаи потери, ктото хавал раньше
 end else
   inherited WndProc(Message)


Evgeny V   (2011-09-12 10:18:00) [27]


> Евгений07   (12.09.11 09:56) [17]
> WSAAsyncSelect = пробовал PostMessage были случаи потерь
> событий об отправке данных серверу  

Потери скорее всего у тебя в логике программы. Надо обрабатывать и результаты возврата функций.


> много ли будет жрать ЦП в случае WSAWaitForMultipleEvents
>  или MsgWaitForMultipleObjects


Лишнего не сожрет, от твоих ошибок не застрахует


Евгений07   (2011-09-12 09:56:00) [28]

Доброго всем времени!
Копнул таймер. Сервер жрет 50% ЦП в моем случае

WSAAsyncSelect = пробовал PostMessage были случаи потерь событий об отправке данных серверу  

Вопрос:

много ли будет жрать ЦП в случае WSAWaitForMultipleEvents  или MsgWaitForMultipleObjects


Вариант   (2011-09-12 08:58:00) [29]


> Евгений07   (09.09.11 16:14)


> Где посоветуете копать?

Если по человечески хочешь в одном потоке, то использовать вместо WSAEventSelect -> WSAAsyncSelect, естественно сначала почитать, что это даст...


Сергей М.   (2011-09-10 17:25:00) [30]


> Для обслуживания серверного сокета я должен создать отдельный
> поток


Да ничего никому ты не должен, не выдумывай небылиц)

Выкидываешь в топку WSAWaitForMultipleEvents, пользуешь вместо него с тем же успехом MsgWaitForMultipleObjects и проблема твоя решена в том же самом единственном основном потоке - и на гнездовые события реагируешь и на виндовые сообщения.


Евгений07   (2011-09-10 07:30:00) [31]

Германн ©
Код свой.
Но старый.
Лучше скажи где копать, Германн


Германн   (2011-09-10 00:57:00) [32]


> Я уже понял, что много выгребать надо.
>

А я ещё понял, что код чужой. Т.е. совсем всё плохо для ТС. :(


Евгений07   (2011-09-10 00:14:00) [33]

Inovet ©
уточнение
Мне много не хочу.
Где зацепиться:
1. 2. 3. из пп  [4] или что то еще ЧЮДО


Евгений07   (2011-09-09 23:56:00) [34]

Inovet ©  
Мне много не надо
Где лучшекопать?


Inovet   (2011-09-09 22:57:00) [35]

> [8] Евгений07   (09.09.11 22:43)
> Какой нормальный механизм мне поможет вылезти из моей ситуации.

Я уже понял, что много выгребать надо.


Евгений07   (2011-09-09 22:57:00) [36]

Перечитал написанное.
Коррекция[7]
к Сергей М. © [5]
Прошу читать
Уяснил
 как
Я за время своей работы я уяснил для себя любимого:
Нужен простой выход из ситуации.
Не ломай что работает.


Евгений07   (2011-09-09 22:43:00) [37]

Inovet ©   (09.09.11 20:10) [6]
> [2] Евгений07   (09.09.11 17:58)
> Как последний вариант сейчас прорабатываю таймер с переменным временем.
Есть нормальный механизм, нет надо ректально сделать.


Слово ректально.... ректально
К употребленному ( + унутрь)  + слову могу предположить не медицинское назначение предложения, хотя медицинский спирт не противоречит моей концепции.
Но ХОРОШИЙ виски лучше.

Какой нормальный механизммне поможет вылезти из моейситуации.


Евгений07   (2011-09-09 22:24:00) [38]

Сергей М. ©   (09.09.11 20:02) [5]
> Ясно что WSAWaitForMultipleEvents это поток

Для обслуживания серверного сокета я должен создать отдельный поток, типа

FEventClose := WSACreateEvent;
WSAEventSelect(Socket,FEvent, FD_CLOSE + FD_READ );
repeat
WaitForSingleObject(FEvent,INFINITE);
WSAEnumNetworkEvents(FSocket,FEvent,@NI);
case NI.lNetworkEvents of
FD_Close:break;
FD_Read: begin
ReceiveData;
end;
end;
WSAResetEvent(FEventClose);
Until false;


Только для получения события обработки данных.

Проблема в том что из СТАРОГО комплекса РАБОЧИХ прог с многолетними заплатками, и кардинальными переделками, примерно 25 файлов немалого кода каждый,  некоторые файлы входят во ВСЕ проги, некоторые в часть прог я должен выдернуть кусок и поместить его в отдельный процесс

Нужен простой выход.
Не ломай что работает.
Уяснил.


Inovet   (2011-09-09 20:10:00) [39]

> [2] Евгений07   (09.09.11 17:58)
> Как последний вариант сейчас прорабатываю таймер с переменным временем.

Есть нормальный механизм, нет надо ректально сделать.


Сергей М.   (2011-09-09 20:02:00) [40]


> Ясно что WSAWaitForMultipleEvents это поток


Чавой-то ?
Поясни свою глубокогениальную мысль ..


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо