![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Работа с потоком
Yandexman © (2005-06-01 12:39:00)Как заставить загрузить Memo1 файл, в отдельном потоке?
-=XP=- (2005-06-01 15:18:00) [1]Я этого не говорил. :)
Если есть под рукой готовый рабочий компонент, то, конечно же, изобретать велосипед не стоит. Но если такого компонента нет, или же имеющийся компонент не обеспечивает всей нужной функциональности - то тут уж лучше засучить рукава и, взяв за основу один из классов VCL, разрабатывать самому.
Yandexman (2005-06-01 15:04:00) [2]Понятно, то есть лучше применить SunEdit чем городить свое, вы это хотели сказать
-=XP=- (2005-06-01 14:38:00) [3]
TLoadThread = class(TThread)
private
FMemo: TMemo;
FFileName: string;
FStrings: TStringList;
protected
procedure Apply;
procedure Execute; override;
public
constructor Create(AMemo: TMemo; const AFileName: string); reintroduce;
end;
constructor TLoadThread.Create(AMemo: TMemo; const AFileName: string);
begin
inherited Create(True);
FMemo := AMemo;
FFileName := AFileName;
Resume;
end;
procedure TLoadThread.Execute;
begin
FStrings := TStringList.Create;
try
FStrings.LoadFromFile(FFileName);
if not Terminated then
Synchronize(Apply);
finally
FStrings.Free;
end;
end;
procedure TLoadThread.Apply;
begin
FMemo.Lines.Assign(FStrings);
end;
С моей точки зрения, это максимум того, что можно вынести в отдельный поток. Основная видимаязадержка будет в методе Apply. Для того, чтобы исключитьэту задержку, необходимо переопределять класс TMemo и работать не с суррогатным TStringList (в примере - FStrings), а с инкапсулированным хранилищем строк TStrings (или кто он там?) класса TMemo.
Alx2 (2005-06-01 13:40:00) [4]Yandexman (01.06.05 13:30) [4]
Большой файл? Сколько строк?
Alex Konshin (2005-06-01 13:39:00) [5]Ты код-то покажи. И объясни зачем тебе это надо.
Можно загрузить в TStringList, а потом Assign в Memo. Только опять-таки смысла не вижу. Как раз-таки другие задачи нужно делать в других потоках, основной поток нужен для UI.
Ты просто выбрал неверный способ отображения.
Чем пользоваться? На вскидку не скажу, у меня для таких целей свои компоненты. В любом случае большой текст в мемо - неудобен для просмотра.
Digitman (2005-06-01 13:39:00) [6]
> Yandexman (01.06.05 13:30) [4]
у Мемо нет метода loadfromfile, он есть у TStrings, каковым явл-ся св-во Мемо.Lines
никто не запрещает загружать TStrings в доп.потоке, важно лишь помнить, что если компонент видимый или не запрещены обновления его канвы, рано или поздно после загрузки приключатся грабли.
> виснит
заключай тело Execute в try..except и выясняй причины "виса"
Yandexman (2005-06-01 13:30:00) [7]
> Кстати, а с чего ты решил, что так будет быстрее?
Не быстрее, просто во время загрузки можно делать другие задачи.
Application.processmessages не подойдет так как виснет во время операции открытия...
> В принципе, можно попробовать поиграться с BeginUpdate -
> EndUpdate (то есть, заблокировать перерисовку Memo на время
> работы загружающего потока) - но смысл этого все же непонятен.
Тоже непонянтно,попытка сделать memo1.loadfromfiles() ни к чему не приводит, результат тот же, виснит.
Юрий Зотов (2005-06-01 12:55:00) [8]В принципе, можно попробовать поиграться с BeginUpdate - EndUpdate (то есть, заблокировать перерисовку Memo на время работы загружающего потока) - но смысл этого все же непонятен.
Digitman (2005-06-01 12:48:00) [9]
> Yandexman (01.06.05 12:39)
> Как заставить загрузить Memo1 файл, в отдельном потоке?
точно так же как и в основном потоке
грабли будут только если в этот момент Memo.Visible=True
Alex Konshin (2005-06-01 12:43:00) [10]Практически никак. VCL не поддерживает multithread. И еще потому, что никто так не делает.
Если файл настолько большой, что нужно загрузка в отдельной нити, то это значит, что не надо использовать Memo.
Кстати, а с чего ты решил, что так будет быстрее?