![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
![]() Проблема в том что при отправке данных через сокет сначало всё нормально, но если запустить ёмкую программу, то обработка отправки прерывается. Прерывание возможно происходит на миллисекунды, но это критически важно. Что бы не было прерываний. Передаётся звук. Как увеличить приоритет отправки (send) и приёма данных?
Вот листинги того что есть сейчас: Отправка буфера: Код:
function WlanSendBuffer(Buffer: Pointer; DataSize: Integer): Boolean; var AmountSent: Integer; Position : Integer; BytesLeftToWrite: Integer; BytesToWrite: Integer; DataPointer: PByte; // arg1:u_long; begin sendr:=false; DataPointer := Buffer; Position := 0; BytesToWrite := 0; // arg1:=1; // IOCtlSocket (SocketHandle,FIONBIO,arg1); while (Position < DataSize) do begin BytesLeftToWrite := DataSize - Position; if (BytesLeftToWrite > 0) then begin if BytesLeftToWrite > 2048 then BytesToWrite := 2048 else BytesToWrite := BytesLeftToWrite; end; AmountSent := send(ClientHandle, DataPointer^, BytesToWrite, 0); if (AmountSent = SOCKET_ERROR) then begin Result := False; Exit; end; Inc(DataPointer, AmountSent); Position := Position + AmountSent; end; // arg1:=0; // IOCtlSocket (SocketHandle,FIONBIO,arg1); Result := True; sendr:=true; end; Создание сокета: Код:
function WlanStartServer() : Boolean; var arg: Integer; IPs: String; begin Result := False; WSAStartup($101, WSADataStruct); // Create socket SocketHandle := Winsock.socket(PF_INET, SOCK_STREAM, 0); if (SocketHandle = INVALID_SOCKET) then begin MessageDlg('socket() failed!', mtError, [mbOK], -1); Exit; end; // Bind socket SockAddr.sin_family := AF_INET; SockAddr.sin_addr.S_addr := INADDR_ANY; SockAddr.sin_port := htons(17584); if (bind(SocketHandle, SockAddr, sizeof(SockAddr)) = SOCKET_ERROR) then begin MessageDlg('The port used by the PSPdisp server is in use. Probably another instance is already running.', mtError, [mbOK], -1); //MessageDlg('bind() failed!', mtError, [mbOK], -1); Exit; end; // Start listening, only accept 1 client (0 clients in backlog) if (listen(SocketHandle, 1) = SOCKET_ERROR) then begin MessageDlg('listen() failed!', mtError, [mbOK], -1); Exit; end; arg := 1000; setsockopt(SocketHandle, SOL_SOCKET, SO_RCVTIMEO, @arg, sizeof(arg)); setsockopt(SocketHandle, SOL_SOCKET, SO_SNDTIMEO, @arg, sizeof(arg)); // Show "Server started" message IPs := GETAllIPAddresses(); MainForm.OptionsWlanAddress.Caption := Ips; if MainForm.OptionsWlanNotifyStart.Checked then MainForm.ShowBalloonHint('PSPdisp: Server started', 'Please connect your PSP to the following IP address:' + #10 + Ips, bfInfo); Result := True; end; |
#2
|
||||
|
||||
![]() send Function:
Цитата:
Цитата:
попробуй setsockopt с SO_SNDBUF Последний раз редактировалось NumLock, 28.06.2010 в 14:28. |
#3
|
|||
|
|||
![]() Попробовал. Стало только хуже...Звук чаще стал заикаться. Поэксперементировал. По подставлял туда разные числа...даже 1048560 ни к чему не приводит. Заикания всё там же и всё так же...
Ветка, которая отправляет данные в реалтайм приоритете. Но когда я начинаю например распаковывать винрар она замедляет свою работу и звук начинает заикаться. Я выяснил что заикание происходит на функции send. Т.е. приоритет выполнения этой функции мал.. Как можно его повысить до максимума?? Может нужно использовать высокоприоритетные данные (out-of-band data)?? Скажите хотя бы куда копать??? Программа загружает комп на 1-2%. Приоритет программы реалтайм. Приоритет ветки тоже максимальный. Однако где-то ещё нужно выставить приоритет. Ведь если я не загружаю программ, то заиканий не возникает! Последний раз редактировалось Master255, 28.06.2010 в 15:28. |
#4
|
|||
|
|||
![]() А зачем давать программе реалтайм, если всё равно сама винда занимается отсылкой? Может наоборот надо понизить?
|
#5
|
|||
|
|||
![]() а винде нельзя задать приоритет на отсылку???
|
#6
|
||||
|
||||
![]() имхо, скорость интернет несоизмеримо меньше быстродействия компьютера, если, конечно эти показатели можно как-то сравнивать)
у меня вообще, скажем так, противоположная проблема: функция send() возвращается сразу же, без ожидания реальной отправки данных в сеть (я не о подтверждении приема, а о самой отправке), хотя в писании сказано другое: будет блокироваться, если размера внутреннего буфера не хватает. а его естественно не должно хватать. а мне это важно, т.к. у меня стоит progressbar в цикле, который в этой ситуации, естественно, пробегает моментом. сама же отправка данных в сеть идет в фоновом режиме и одному (?) известно, когда она закончится. это так работает на Windows 7, на XP же функция send() как и положено блокируется на время отправки пакета и progressbar показывает реальный процесс передачи данных. Последний раз редактировалось NumLock, 29.06.2010 в 13:23. |