Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

idfrp.onprogress [D7, WinXP]


maximsm ©   (2005-07-23 12:50:00) 

Здравствуйте!

Есть проблема с компонентом tidFtp
у него есть события

OnWorkBegin
OnWork
OnWorkEnd

они конечно срабатывают, но, видимо не синхронизируются с основным потоком.

OnWork:
g2.Progress:=round((AWorkCount/g2.MaxValue)*100);
Application.ProcessMessages;
invalidate;
прогресс вычисляется правильно,
но так как дело происходит в потоке,
то проривоваться не удаётся.
Я пытался найти в исходниках потоки,
но даже упоминания там не увидел.
Как быть?
Как отыскать поток и заставить его синхронизироваться?


maximsm   (2005-07-27 15:49:00) [1]

Спасибо, Джо!

Я напутал с tgauge.progress
он в рантайме вообще не устанавливается.
И работать можно только с addProgress


Джо   (2005-07-27 04:55:00) [2]

maximsm   (23.07.05 12:50) [0].

Не знаю, у меня все прекрасно работает с Инди. Посмотри, может ты чего-то напутал.
---
Мой работающий код.
На форме IdFTP1, Button1, ProgressBar1.

procedure TForm1.Button1Click(Sender: TObject);
var
 AStream: TMemoryStream;
begin
 AStream := TMemoryStream.Create;
 try
   IdFTP1.User := 'Anonymous';
   IdFTP1.Password := 'me@me.com';
   IdFTP1.Connect(True);
   IdFTP1.Host := ' ftp://work';
   // размер файла
   ProgressBar1.Max := IdFTP1.Size('video/movies/Hon.Gil.Don.avi');
   // получаем файл
   IdFTP1.Get('video/movies/Hon.Gil.Don.avi',AStream);
 finally
   AStream.Free;
 end;
end;

procedure TForm1.IdFTP1Work(Sender: TObject; AWorkMode: TWorkMode;
 const AWorkCount: Integer);
begin
 Application.ProcessMessages;
 Caption := Format ('%d из %d скачано',[ProgressBar1.Max,AWorkCount]);
 ProgressBar1.Position := AWorkCount;
end;


Вот и весь код. Больше никаких ни обработчиков событий, ни рефрешей/инвалидэйтов.


maximsm   (2005-07-27 04:16:00) [3]

посоветовали ICS,
говорят что круто и безглючно.
Поставил.

Пишу onProgress : gauge1.progress=50;
пишу multithreaded:=false
Ноль эмоций.
Они что все сговорились? Зачем давать доступ к событию
onProgress если оно не работает???


maximsm   (2005-07-25 17:54:00) [4]

Скажите, что мне даст этот ID ?

Да, я смогу манипулировать этим потоком, в этот конкретный раз,
один раз я смогу сам себе показать прогресс, прекрасно!
Но мне то надо юзеру показывать этот прогресс всегда,
а для этого мне нужно найти поток не в памяти, а в исходниках.
в юните idftp ни одного упоминания о tthread.

>Ты же потоки сам соpдаёшь?

Этот сор даёт ifFtp, а не я. Мне найти бы этот сор,
я даже согласен отказаться от многопоточности ради прорисовки прогресса.


tesseract   (2005-07-24 19:38:00) [5]

>>> не нашёл я своего потока,
Молодец !!!!!!!

Ты же потоки сам соpдаёшь? сделай так что-бы они отчитывались о своей работе. Записывай их ID в какой-нибудь Tlist


maximsm   (2005-07-24 19:23:00) [6]

не нашёл я своего потока, сколько не рылся в дремучих исходниках indy.

может быть есть альтернативы idFTP с безглючной Progres индикацией?


tesseract   (2005-07-23 20:54:00) [7]

>>как вообще выловить все потоки что есть в моей программе и заставить конкретный из них синхронизироваться?

Ты их создал ты их и контролируй. Для этого и придуманы TcriticalSection TSemaphore Tmutex и тд


begin...end   (2005-07-23 20:35:00) [8]

> maximsm   (23.07.05 18:17) [1]

> как вообще выловить все потоки что есть в моей
> программе

Сделать снимок с помощью CreateToolhelp32Snapshot, затем вызывать Thread32First/Thread32Next и находить потоки своего процесса, сравнивая поле tagTHREADENTRY32.th32OwnerProcessID с результатом GetCurrentProcessId. Для каких-либо операций с найденным потоком можно использовать его Id, хранящийся в поле tagTHREADENTRY32.th32ThreadID.


maximsm   (2005-07-23 18:17:00) [9]

как вообще выловить все потоки что есть в моей программе и заставить конкретный из них синхронизироваться?


Наверх

Титульная страница Поиск, карта сайта Написать письмо