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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Stack OverFlow 
V
    Опции темы
ButtonOFF
Дата 27.11.2009, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


улетевший
*


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

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



Всем привет.

Есть клиент и сервер,передаю файлы функцией TransmitFile.

Вот так отправляю:
Код

...

  hFile := CreateFile(FileName,
                      GENERIC_READ,
                      FILE_SHARE_READ,
                      Security,
                      OPEN_EXISTING,
                      FILE_FLAG_SEQUENTIAL_SCAN,
                      0);
    if hFile = INVALID_HANDLE_VALUE then Exit;

...

      if not TransmitFile(sock, hFile, 0, 0, nil, nil, TF_USE_KERNEL_APC) then ShowMessage('TransmitFile error'+IntToStr(WSAGetLastError));

Вот так получаю:
Код

  if Transfer then begin
    if not WriteFile(hFile, buf, Len, Written, nil) then begin
      ShowMessage('Write error '+IntToStr(GetLastError));
      Transfer := false;
      exit;
    end;
    inc(size,Len);
    if Size >= FileSize then Transfer := false;
  end;


Вот пытаюсь передать фильм но где то на середине выскакивает ошибка Stack OverFlow. Сокет работает в асинхронном режиме, модель WSAAsyncSelect.

Это сообщение отредактировал(а) ButtonOFF - 27.11.2009, 14:35
PM MAIL   Вверх
ButtonOFF
Дата 27.11.2009, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


улетевший
*


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

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



Всем спасибо за помощь, нужно просто перевести сокет в блокирующий режим.
PM MAIL   Вверх
ButtonOFF
Дата 28.11.2009, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


улетевший
*


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

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



Перевожу в блокирующий режим - принимаю файл, если клиент отрубается (мало ли ошибка при чтении файла или еще что), мой сокет в блоке так и остается висеть и пропускает "мимо ушей" FD_CLOSE, из-за того что находится в блоке и все еще ждет len := recv(). Как сделать оптимально чтоб и то и то работало. Пока что смотрю в сторону дюпсокета, опять же его нужно создать, потом сокет, потом старый переводить на FD_CLOSE only, а дюпнтуый в блок потом все обратно... геморой какой то имхо, как проще сделать ?
PM MAIL   Вверх
dumb
Дата 2.12.2009, 02:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

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



приведенный код никакой ценности в вопросе описании проблемы не имеет.
при разрыве соединения удаленной стороной, recv на сокете в блокирующем режиме вернет 0. "пропуск мимо ушей" FD_CLOSE из-за блокирующего режима - сказки.
PM MAIL   Вверх
ButtonOFF
Дата 2.12.2009, 12:15 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


улетевший
*


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

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



не 0, а -1, это во-первых. Во-вторых проблема в переполнении стэка, какой код тебе нужен чтоб украсить эту проблему? скрин ошибки ? В 1 посте написана проблема, код приведен просто так, на него можно не смотреть если не хочется.

ps Я вообще-то и без тебя это знаю, если нече сказать по теме то зачем вообще писать?

Это сообщение отредактировал(а) ButtonOFF - 2.12.2009, 12:16
PM MAIL   Вверх
dumb
Дата 3.12.2009, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

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



таким вот "знающим" совет только один: помогай себе сам и не засоряй форум.

Цитата(ButtonOFF @  2.12.2009,  12:15 Найти цитируемый пост)
не 0, а -1, это во-первых.

Цитата(msdn)
Return Value

If no error occurs, recv returns the number of bytes received and the buffer pointed to by the buf parameter will contain this data received. If the connection has been gracefully closed, the return value is zero.

PM MAIL   Вверх
Vladimir_
Дата 8.12.2009, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте,
У меня другая ситуация: нет рекурсий; нет функций, в которой бы я передавал параметры и вызывал ее часто, все крутится в одно обработчике- по нажатию кнопки

вот обработчик : 

Код

procedure TForm1.Metod_3_S_3;

const
r=1000;//strtoint(edit7.Text);
p1=3;
z1=3;
//l - образы
var
i,j,k,l:longint;
Em,Ex: extended;
yj,gj: Array [1..100] of extended;
yk,gk: Array [1..3] of extended;

begin
it:=0;
ex:=0;

Repeat

  inc(it);
  Form1.Edit13.Text:=IntToStr(it);
  //===обнуляем вых значения и ошибки

  Em:=0;
  //====Подаем образы
  For l:=1 to StrToInt(Form1.Edit11.Text) do
   begin
     //===Находим вых знач скрытого слоя
     For j:=1 to StrToInt(Form1.Edit8.Text)  do
      begin
        yj[j]:=0;
        For i:=1 to p1 do
         yj[j]:=yj[j]+wij[i,j]*arr[i,l];
        yj[j]:=yj[j]-Tj[j];
        yj[j]:=(1/(1+exp(-yj[j])));
        Application.ProcessMessages;
      end;
     //====Находим выходные значения всей сети
     For k:=1 to z1 {3} do
      begin
        yk[k]:=0;
        For j:=1 to StrToInt(Form1.Edit8.Text) do
         yk[k]:=yk[k]+wjk[j,k]*yj[j];
        yk[k]:=yk[k]-Tk[j];
        Application.ProcessMessages;
      end;
      //===находим ошибки сети
       //==для вых слоя
      For k:=1 to z1 {3} do
       gk[k]:=yk[k]-arr[k,l+1];
       //для скрыт слоя
      For j:=1 to StrToInt(Form1.Edit8.Text) do
       begin
         gj[j]:=0;
         For k:=1 to z1 do
           gj[j]:=gj[j]+gk[k]*wjk[j,k];
       end;


      //==поправляем веса вых слоя
      for j:=1 to StrToInt(Form1.Edit8.Text) do
        for k:=1 to z1 do
           wjk[j,k]:=wjk[j,k]-alfa*yj[j]*gk[k];

      for k:=1 to z1 do
         Tk[k]:=Tk[k]+alfa*gk[k];

      //==веса скрыт слоя
      for i:=1 to p1 do
         for j:=1 to StrToInt(Form1.Edit8.Text) do
           wij[i,j]:=wij[i,j]-alfa*gj[j]*yj[j]*(1-yj[j])*arr[i,l];

      for j:=1 to StrToInt(Form1.Edit8.Text) do
        Tj[j]:=Tj[j]+alfa*gj[j]*yj[j]*(1-yj[j]);
      //===Находим ошибку

      for k:=1 to z1 do
        Em:=Em +(1/2)*sqr(yk[k]-arr[k,l+1]);
   end;

  Form1.Refresh; 
  Form1.Edit14.Text:=FloatToStr(Em);
  Form1.ProgressBar1.Position := Round(100* E / Em );
  Application.ProcessMessages

Until (Em<=E);

  Form1.ProgressBar1.Position := 0;


end;


в самом первом  vare описал массив :
  arr: Array [1..3,1..100000] of real;

Я и все realы заменил extendedами.... уверен что зацикливания не происходит,  т.к если я поставлю размер выборки не 50 а допустим 5-10, шаг обучения 0,1 и среднеквадратичную ошибку 0,1 - отработает без проблем, сообственно это было пояснение к моей программе, которая прилагается....

Обьясните в чем казус,что нужно сделать ,чтобы исправить ситуацию, спасибо!

Это сообщение отредактировал(а) Vladimir_ - 8.12.2009, 16:19

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  NeuroNetworks.rar 30,51 Kb
PM MAIL   Вверх
1000000dollars
Дата 8.12.2009, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Код

procedure TForm1.Timer1Timer(Sender: TObject);
begin

Case Form1.ComboBox1.ItemIndex of

0: begin
   Metod_3_S_3; // начинаем очень долгий процесс вычислений, а таймер тем временем продолжает работать и...
                           // полсекунды спустя будет ещё один вызов Metod_3_S_3. И так далее, пока стек не будет забит 
                           // адресами возвратов и локальными переменными Metod_3_S_3.
   end;

1: begin
   Metod_6_S_3;
   end;


   end;

   Form1.Timer1.Enabled:=false;

end;


Решение: остановить таймер до case или убрать его совсем, ибо он тут (как я понял из беглого осмотра) не нужен.

PS: Напоминаю, что на этом форуме действует правило: одна тема - один вопрос.

Это сообщение отредактировал(а) 1000000dollars - 8.12.2009, 16:53
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

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

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

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

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


 




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


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

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