Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Подвисание при передаче...

7.9K
11 января 2007 года
user13
66 / / 07.11.2006
При передачи файла через сокеты у меня подвисает приложение до тех пор пока передача файла не завершится.
Как сделать так чтобы приложение не подвисало?
257
11 января 2007 года
kosfiz
1.6K / / 18.09.2005
посмотреть на код не помешало бы.
8
11 января 2007 года
mfender
3.5K / / 15.06.2005
Оно не подвисает, а ждёт окончания передачи.
Windows - система многозадачная, вот и организуй потоки. Один файлы пересылает, другой работает что-нибудь другое.
5
11 января 2007 года
hardcase
4.5K / / 09.08.2005
У тебя был произведён блокирующий вызов WriteFile(...) - как вариант можно использовать асинхронный ввод-вывод, тогда блокирования на вызове WriteFile() не произойдёт, но нужно периодически опрашивать систему о состоянии передачи данных.
7.9K
11 января 2007 года
user13
66 / / 07.11.2006
Вот код передачи файла

Код:
...
var

  MS: TMemoryStream;
.......

procedure TForm1.Button2Click(Sender: TObject);
var
Size: integer;
P: ^Byte;
na : String;
begin

if OpenDialog1.Execute then begin
MS := TMemoryStream.Create;// Создаём буфер для файла
MS.LoadFromFile(OpenDialog1.FileName); // Загружаем файл в буфер
na := ExtractFileName(OpenDialog1.FileName);
ServerSocket1.Socket.Connections[0].SendText('file#'+na+'#'+IntToStr(MS.Size)+'#');
ProgressBar1.Position := MS.Size*100 div Size;
MS.Position := 0; // Переводим каретку в начало файла
P := MS.Memory; // Загружаем в переменную "P" файл
Label5.Caption := na;
ServerSocket1.Socket.Connections[0].SendBuf(P^, MS.Size); // Посылаем файл
end;


а вот код принятия файла
Код:
private
  FStream: TFileStream;
{ Private declarations }
Name: string;
Size: integer;
Receive: boolean;
MS: TMemoryStream;
  public



procedure TForm1.Writing(Text: string);
begin
if MS.Size < Size then // Если принято байт меньше размера файла, то...
MS.Write(Text[1], Length(Text)); // Записываем в буфер
// Выводим прогресс закачки файла
ProgressBar1.Position := MS.Size*100 div Size;
StatusBar1.SimpleText := 'Принято '+IntToStr(MS.Size)+' из '+IntToStr(Size);
if MS.Size = Size then // Если файл принят, то...
begin
Receive := false; // Переводим клиента в нормальный режим
MS.Position := 0; // Переводим каретку в начало буфера
MS.SaveToFile('Dowloads\'+Name); // Сохраняем файл
ClientSocket1.Socket.SendText('end'); // Посылаем команду "end", то есть файл принят
MS.Free; // Убиваем буфер
StatusBar1.SimpleText := 'Файл принят';
end;
end;



procedure TForm1.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
var
Rtext: string; // Принятый текст
begin
Rtext := Socket.ReceiveText;
if Receive then // Если клиент в режиме приёма файла, то...
Writing(RText) // Записываем данные в буфер
else // Если клиент не в режиме приёма файла, то...
if Copy(Rtext, 0, Pos('#', Rtext) -1) = 'file' then // Если это файл, то...
begin MS := TMemoryStream.Create; // Создаём буфер для файла
Delete(Rtext, 1, Pos('#', Rtext)); // Определяем имя файла
Name := Copy(Rtext, 0, Pos('#', Rtext) -1); // Определяем имя файла
Delete(Rtext, 1, Pos('#', Rtext)); // Определяем размер файла
Size := StrToInt(Copy(Rtext, 0, Pos('#', Rtext) -1)); // Определяем размер файла
Delete(Rtext, 1, Pos('#', Rtext)); // Удаляем последний разделитель
Label1.Caption := 'Размер файла: '+IntToStr(Size)+' байт'; // Выводим размер файла
Label2.Caption := 'Имя файла: '+Name; // Выводим имя файла
Receive := true; // Переводим сервер в режим приёма файла
Writing(RText); // Записываем данные в буфер
end;
end;
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог