Форум: "Основная";
Текущий архив: 2005.06.29;
Скачать: [xml.tar.bz2];
ВнизРабота с потоком Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.04 c