![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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. |