![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
WSAWaitForMultipleEvents для однонитевого сервера [D6, XP]
Евгений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 это поток
Чавой-то ?
Поясни свою глубокогениальную мысль ..