![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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]как вообще выловить все потоки что есть в моей программе и заставить конкретный из них синхронизироваться?