Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.06.29;
Скачать: CL | DM;

Вниз

Работа с потоком   Найти похожие ветки 

 
Yandexman   (2005-06-01 12:39) [0]

Как заставить загрузить Memo1 файл, в отдельном потоке?


 
Alex Konshin ©   (2005-06-01 12:43) [1]

Практически никак. VCL не поддерживает multithread. И еще потому, что никто так не делает.
Если файл настолько большой, что нужно загрузка в отдельной нити, то это значит, что не надо использовать Memo.
Кстати, а с чего ты решил, что так будет быстрее?


 
Digitman ©   (2005-06-01 12:48) [2]


> Yandexman   (01.06.05 12:39)  
> Как заставить загрузить Memo1 файл, в отдельном потоке?


точно так же как и в основном потоке
грабли будут только если в этот момент Memo.Visible=True


 
Юрий Зотов ©   (2005-06-01 12:55) [3]

В принципе, можно попробовать поиграться с BeginUpdate - EndUpdate (то есть, заблокировать перерисовку Memo на время работы загружающего потока) - но смысл этого все же непонятен.


 
Yandexman   (2005-06-01 13:30) [4]


> Кстати, а с чего ты решил, что так будет быстрее?

Не быстрее, просто во время загрузки можно делать другие задачи.
Application.processmessages не подойдет так как виснет во время операции открытия...

> В принципе, можно попробовать поиграться с BeginUpdate -
> EndUpdate (то есть, заблокировать перерисовку Memo на время
> работы загружающего потока) - но смысл этого все же непонятен.

Тоже непонянтно,попытка сделать memo1.loadfromfiles() ни к чему не приводит, результат тот же, виснит.


 
Alex Konshin ©   (2005-06-01 13:39) [5]

Ты код-то покажи. И объясни зачем тебе это надо.
Можно загрузить в TStringList, а потом Assign в Memo. Только опять-таки смысла не вижу. Как раз-таки другие задачи нужно делать в других потоках, основной поток нужен для UI.
Ты просто выбрал неверный способ отображения.
Чем пользоваться? На вскидку не скажу, у меня для таких целей свои компоненты. В любом случае большой текст в мемо - неудобен для просмотра.


 
Digitman ©   (2005-06-01 13:39) [6]


> Yandexman   (01.06.05 13:30) [4]


у Мемо нет метода loadfromfile, он есть у TStrings, каковым явл-ся св-во Мемо.Lines

никто не запрещает загружать TStrings в доп.потоке, важно лишь помнить, что если компонент видимый или не запрещены обновления его канвы, рано или поздно после загрузки приключатся грабли.


> виснит


заключай тело Execute в try..except и выясняй причины "виса"


 
Alx2 ©   (2005-06-01 13:40) [7]

Yandexman   (01.06.05 13:30) [4]

Большой файл? Сколько строк?


 
-=XP=- ©   (2005-06-01 14:38) [8]

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.


 
Yandexman   (2005-06-01 15:04) [9]

Понятно, то есть лучше применить SunEdit чем городить свое, вы это хотели сказать


 
-=XP=- ©   (2005-06-01 15:18) [10]

Я этого не говорил. :)
Если есть под рукой готовый рабочий компонент, то, конечно же, изобретать велосипед не стоит. Но если такого компонента нет, или же имеющийся компонент не обеспечивает всей нужной функциональности - то тут уж лучше засучить рукава и, взяв за основу один из классов VCL, разрабатывать самому.



Страницы: 1 вся ветка

Текущий архив: 2005.06.29;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.027 c
4-1115309163
Гость_01
2005-05-05 20:06
2005.06.29
Как запустить программу и получить handle ее окна ?


14-1117290488
Ломброзо
2005-05-28 18:28
2005.06.29
Как подписаться на буржуйскую группу новостей?


14-1117623005
Pearled
2005-06-01 14:50
2005.06.29
Задачка для любителей математики


1-1118060894
Mr.F
2005-06-06 16:28
2005.06.29
Оптимальная сортировка


1-1118032882
dp200
2005-06-06 08:41
2005.06.29
OpenDialog1