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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с FtpPutFile, Тормозит приложение до окончания выполне 
V
    Опции темы
pavelv
Дата 6.7.2006, 08:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Код

    if not Assigned(FtpHandle) then
      InternetCloseHandle(InetHandle);
   else
     try
        FtpPutFile(FtpHandle, PChar('1.rar'), PChar('1.rar'), FTP_TRANSFER_TYPE_BINARY, 255);
     except
    end;

Проблема в том, что пока не выполнится FtpPutFile приложение не реагирует на внешние 'раздражители'. Сначала хотел показывать сколько байт передалось уже, но сам не осилил.
 Решил просто сделать таймер и прогресс бар, пусть заполняется и сбрасывается...Тоесть на событие OnTimer положил:
if progressbar1.posiotion >=100 then progressbar1.position :=0;
progressbar1.position := progressbar1.position + 5;
Но когда программа доходит до выполнения процедуры FtpPutFile всё замирает и пока файл не будет скопирован заново работать не начинает. А копирование по модему не очень быстро происходит, как бы юзер не подумал что всё подвисло. 
Как решить? Может нужно использовать другие компоненты для копирования?

P.S> Ссылка на FtpPutFile : http://forum.vingrad.ru/index.php?showtopic=102850 
PM MAIL   Вверх
Mechanic
Дата 6.7.2006, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 5.5.2006
Где: Kharkov, Ukraine

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



Отдельный поток поможет. 
--------------------
Tell me the extensions of the files You backup and I'll tell You who You are..  ©Mch  
PM   Вверх
Akella
Дата 6.7.2006, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

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



c сетью нужно работать в потоках, или используй Indy  

Это сообщение отредактировал(а) Akella - 6.7.2006, 11:13
PM MAIL   Вверх
pavelv
Дата 6.7.2006, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Если честно не сталкивался раньше с отдельными потоками, попробовал сделать и всё вылетает.
Не понимаю Synchronize вообще с чем должен синхронизировать и в каком месте мне нужно делать проверку на Terminated, я так понимаю она мне нужна.

Сделал вот как:

Код

type
  TThread_ftp = class(TThread)
  private
    { Private declarations }
  protected
    procedure tt;
    procedure Execute(); override;
  end;

procedure TThread_ftp.tt;
begin
 Form_transfer.Timer1Timer(nil);
end;

procedure TThread_ftp.Execute;
begin
     try
        FtpPutFile(FtpHandle, PChar('1.rar'), PChar('1.rar'), FTP_TRANSFER_TYPE_BINARY, 255);
        Synchronize(tt);
        except
     end;
  InternetCloseHandle(InetHandle);
end;


Код

procedure TForm_transfer.Timer1Timer(Sender: TObject);
begin
 if ProgressBar1.Position>=100 then ProgressBar1.Position:=0;
 ProgressBar1.Position := ProgressBar1.Position + 49;
end;

procedure TForm_transfer.CopyBD;
begin
   InetHandle := InternetOpen(PChar('FTP'), 0, nil, nil, 0);
    FtpHandle := InternetConnect(InetHandle, PChar(Form_podgot_otpr.ServerName.Text), 21, PChar('anonymous'),
        PChar('[email protected]'), INTERNET_SERVICE_FTP, 0, 255);
    if not Assigned(FtpHandle) then
      InternetCloseHandle(InetHandle);
   else
     begin
      TFtp := TThread_ftp .Create(True);
      TFtp.FreeOnTerminate := true;
      TFtp.Priority := tpLower;
      TFtp.Resume;
     end;

 Close;
end;

Вроде всё как написана в инете smile
 
PM MAIL   Вверх
Poseidon
Дата 7.7.2006, 00:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

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



Конечно TThread использовать правильнее, но не обязательно в этом случае. Тем более, как я заметил из твоего кода, ты не совсем понял как ОНО работает smile 

Попробуй так:

Код

Procedure FtpPut;
begin
{ здесь вся процедура закачки }
InetHandle := InternetOpen(PChar('FTP'), 0, nil, nil, 0);
FtpHandle := InternetConnect(InetHandle, PChar(Form_podgot_otpr.ServerName.Text), 21, PChar('anonymous'),  PChar('[email protected]'), INTERNET_SERVICE_FTP, 0, 255);
try
  if not Assigned(FtpHandle)
  then InternetCloseHandle(InetHandle);
  else FtpPutFile(FtpHandle, PChar('1.rar'), PChar('1.rar'), FTP_TRANSFER_TYPE_BINARY, 255);
except InternetCloseHandle(InetHandle); end;

ExitThread(0);
end;

procedure TForm1.Button1Click(Sender: TObject);  
var  h:cardinal;  
begin  
{ создаем отдельный поток для процедуры закачки }
CreateThread(nil, 128, @FtpPut, self, 0, h);  
end; 

     

Это сообщение отредактировал(а) Poseidon - 7.7.2006, 00:45


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
pavelv
Дата 7.7.2006, 05:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Как отдельный поток он конечно запускается, но срабатывает через раз. 
На 2 из 3 вылетает ошибка:
показан лист CPU:
THREAD #2800
7C81EB33  5E               pop esi
и ошибка компилятора:
DEBUGER FAULT NOTIFICATION
"PROJECT  C:\..\project1.exe faulted with message:'application-defined exception (code 0x0eedfade)
at 0x7c81eb33'". Process stoped

Судя по тому, что раньше такого не возникало думаю дело как раз в потоках.  
PM MAIL   Вверх
Poseidon
Дата 7.7.2006, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

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



С каким кодом это происходит? Что делаешь при этом? Даешь-ли завершиться потоку (закачаться файлу) прежде чем запустить еще один поток? 


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
pavelv
Дата 10.7.2006, 04:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



 Я делаю всё как ты написал. Единственное отличие, что у меня после FtpPutFile вызывается ещё ShowMessage. А в параллельном потоке, тоесть на главной форме в процессе выполнения потока вызывается только OnTimer, который обращается к прогрессбару, чтобы пользователь видел работу приложения.


Код

procedure TForm_transfer.CopyBD;
var
    FtpHandle,InetHandle: HInternet;
    NameFile:string;
begin
   InetHandle := InternetOpen(PChar('FTP'), 0, nil, nil, 0);

    FtpHandle := InternetConnect(InetHandle, PChar(Form_podgot_otpr.ServerName.Text), 21, PChar('anonymous'),
        PChar('[email protected]'), INTERNET_SERVICE_FTP, 0, 255);

    if not Assigned(FtpHandle) then
     begin
      InternetCloseHandle(InetHandle);
      ShowMessage('FTP ñîåäèíåíèå íå óñòàíîâëåíî');
     end
   else
     try
        NameFile :='n'+Form_podgot_otpr.ID.Text+'_'+Form_podgot_otpr.NameUser.Text+'.rar';
        FtpPutFile(FtpHandle, PChar(ExtractFilePath(Application.ExeName)+'Temp\1.rar'), PChar(Form_podgot_otpr.ServerPath.Text+'/'+NameFile), FTP_TRANSFER_TYPE_BINARY, 255);
        ShowMessage('Ôàéë áàçû äàííûõ óñïåøíî ñêîïèðîâàí íà ñåðâåð');
        except
      ShowMessage('Error: îòïðàâêà ôàéëà íå çàâåðøåíà');
     end;
  InternetCloseHandle(InetHandle);

ExitThread(0);

end;

procedure TForm_transfer.Button2Click(Sender: TObject);
 var  h:cardinal;
begin
 CreateThread(nil, 128, @TForm_transfer.CopyBD, self, 0, h);
end;

Вот мой код. Я думаю может дело в памяти, выделяется не правильно или ещё что? 
PM MAIL   Вверх
Akella
Дата 10.7.2006, 08:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

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



Цитата(pavelv @  6.7.2006,  12:24 Найти цитируемый пост)
Не понимаю Synchronize вообще с чем должен синхронизировать и в каком месте мне нужно делать проверку на Terminated, я так понимаю она мне нужна.


Synchronize нужно вызывать, когда обращаешься к VCL, например, чтобы не было конфликтов твоего потока с главным потоком VCL.

Код

procedure TReadBarCode.Execute;
begin
  if not assigned(BarCodePort1) then
  begin
    BarCodePort1 := TComPort.Create;
    BarCodePort1.Baud := Baud;
    BarCodePort1.PortNumber := ComPort;
    BarCodePort1.OpenInitPort(BarCodePort1.SizeBuf);
  end;//if
  if BarCodePort1.Connceted then

    while Not Terminated

    do begin
      fBarCode := BarCodePort1.GetBarCodeFromComPort;
      if fBarCode <> ''
      then begin
        Synchronize(SetBarCodeForParentForm);

//SetBarCodeForParentForm - процедура, которая обращается на форме к TEdit
        fBarCode := '';
      end;//if
      Sleep(SleepTime);
    end;//while
  BarCodePort1.CloseComPort;
end;

 
PM MAIL   Вверх
pavelv
Дата 10.7.2006, 08:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Я так понял, что использование CreateThread освобождает меня он Synchronize smile. Покрайней мере каждый 2ой раз она обычно срабатывает, что и настораживает если честно.
Такой вопрос, а TReadBarCode.Execute в каком месте вызывать? Я ведь не пишу отдельный модуль с классом TThread.
 
PM MAIL   Вверх
Akella
Дата 10.7.2006, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

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



TReadBarCode.Execute вызываю при старте приложения 
PM MAIL   Вверх
pavelv
Дата 10.7.2006, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Я конечно извиняюсь за то, что не спросил сразу...просто не пытался вызвать.
TReadBarCode, BarCodePort1 это что такое? smile. 
//SetBarCodeForParentForm - процедура, которая обращается на форме к TEdit
вы имеете ввиду процедуру которая выступает в качестве параллельного потока, copyBD в моем случае?

P.S> Посмотрел кучу инфы на этом форуме и в инете, примеров использования синхрониз нету...видимо в всех так работало. 
PM MAIL   Вверх
pavelv
Дата 10.7.2006, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Пробовал BeginThread с теми же параметрами(правда h:=0 писал). Работает через раз. Когда не работает вылетает по ошибке:Project raised exception class EInvalidOperation with message "Canvas does not allow drawing"....

Иногда говорит: "Недопустимый дескриптор окна". 
PM MAIL   Вверх
pavelv
Дата 12.7.2006, 05:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Всем спасибо за советы. Проблема заключалась именно в ShowMessage, его использование в параллельном процессе приводит к перегрузке ЦП. Я лично реализовал BeginThread, но проверил и CreateThread работает безотказно. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

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

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

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


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

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


 




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


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

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