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

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

Работа с потоком


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.
Кстати, а с чего ты решил, что так будет быстрее?


Наверх

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