Форум: "Основная";
Текущий архив: 2005.08.14;
Скачать: [xml.tar.bz2];
Внизidfrp.onprogress Найти похожие ветки
← →
maximsm (2005-07-23 12:50) [0]Здравствуйте!
Есть проблема с компонентом tidFtp
у него есть события
OnWorkBegin
OnWork
OnWorkEnd
они конечно срабатывают, но, видимо не синхронизируются с основным потоком.
OnWork:
g2.Progress:=round((AWorkCount/g2.MaxValue)*100);
Application.ProcessMessages;
invalidate;
прогресс вычисляется правильно,
но так как дело происходит в потоке,
то проривоваться не удаётся.
Я пытался найти в исходниках потоки,
но даже упоминания там не увидел.
Как быть?
Как отыскать поток и заставить его синхронизироваться?
← →
maximsm (2005-07-23 18:17) [1]как вообще выловить все потоки что есть в моей программе и заставить конкретный из них синхронизироваться?
← →
begin...end © (2005-07-23 20:35) [2]> maximsm (23.07.05 18:17) [1]
> как вообще выловить все потоки что есть в моей
> программе
Сделать снимок с помощью CreateToolhelp32Snapshot, затем вызывать Thread32First/Thread32Next и находить потоки своего процесса, сравнивая поле tagTHREADENTRY32.th32OwnerProcessID с результатом GetCurrentProcessId. Для каких-либо операций с найденным потоком можно использовать его Id, хранящийся в поле tagTHREADENTRY32.th32ThreadID.
← →
tesseract © (2005-07-23 20:54) [3]>>как вообще выловить все потоки что есть в моей программе и заставить конкретный из них синхронизироваться?
Ты их создал ты их и контролируй. Для этого и придуманы TcriticalSection TSemaphore Tmutex и тд
← →
maximsm (2005-07-24 19:23) [4]не нашёл я своего потока, сколько не рылся в дремучих исходниках indy.
может быть есть альтернативы idFTP с безглючной Progres индикацией?
← →
tesseract © (2005-07-24 19:38) [5]>>> не нашёл я своего потока,
Молодец !!!!!!!
Ты же потоки сам соpдаёшь? сделай так что-бы они отчитывались о своей работе. Записывай их ID в какой-нибудь Tlist
← →
maximsm (2005-07-25 17:54) [6]Скажите, что мне даст этот ID ?
Да, я смогу манипулировать этим потоком, в этот конкретный раз,
один раз я смогу сам себе показать прогресс, прекрасно!
Но мне то надо юзеру показывать этот прогресс всегда,
а для этого мне нужно найти поток не в памяти, а в исходниках.
в юните idftp ни одного упоминания о tthread.
>Ты же потоки сам соpдаёшь?
Этот сор даёт ifFtp, а не я. Мне найти бы этот сор,
я даже согласен отказаться от многопоточности ради прорисовки прогресса.
← →
maximsm (2005-07-27 04:16) [7]посоветовали ICS,
говорят что круто и безглючно.
Поставил.
Пишу onProgress : gauge1.progress=50;
пишу multithreaded:=false
Ноль эмоций.
Они что все сговорились? Зачем давать доступ к событию
onProgress если оно не работает???
← →
Джо © (2005-07-27 04:55) [8]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 15:49) [9]Спасибо, Джо!
Я напутал с tgauge.progress
он в рантайме вообще не устанавливается.
И работать можно только с addProgress
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.08.14;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.011 c