Форум: "Начинающим";
Текущий архив: 2011.10.09;
Скачать: [xml.tar.bz2];
ВнизTThread - Хм....Виснет однако.... Найти похожие ветки
← →
Pepe (2011-06-19 12:15) [0]Добрый времени суток, уважаемые гуру. Столкнулся с проблемой потоков. Ранее особо этой областью не пользовался. Но сейчас этого требуют обстоятельства. Задача передо мной такая. Открывать одновременно несколько файлов и считывать из них достаточно большой объём информации.
Но.... эта система крошится даже при работе всего одного потока. Главный поток зависает, т.е форма и прочие элементы интерфейса перестают быть юзабельными до тех пор пока не завершится работа того потока который работает с файлом. Приведу краткое содержание моего потока, возможно я что-то упустил и это вызывает негодование у программы.type
TNTPTurnLoading = class(TThread)
private
CalcItem: Pointer;
protected
procedure Execute; override;
procedure DoWork;
public
constructor Create(P: PItem); virtual;
destructor Destroy; override;
end;procedure TNTPTurnLoading.DoWork;
var
NA: TMyClass;
begin
NA:= TMyClass.Create;
NA.FileName:= PItem(CalcItem)^.FileName;
if Na.ReadData>-1 then
begin
PItem(CalcItem)^.Data1:= na.Data1;
PItem(CalcItem)^.Data2:= na.Data2;
end;
pl.UpdateIndex(CalcItem);
Na.Free;
end;
constructor TNTPTurnLoading.Create(P: PItem);
begin
CalcItem:= p;
inherited Create(False);
end;
procedure TNTPTurnLoading.Execute;
begin
if CalcItem = nil then Terminate;
Synchronize(DoWord);
Terminate;
Создаётся такой поток посредством
TNTPTurnLoading.Create(Pointer);
Надеюсь вы мне поможете разобраться в сложившихся обстоятельствах.
← →
DVM © (2011-06-19 12:37) [1]
> Pepe (19.06.11 12:15)
> Главный поток зависает, т.е форма и прочие элементы интерфейса
> перестают быть юзабельными до тех пор пока не завершится
> работа того потока который работает с файлом.
Даже не вдаваясь в изучение подробностей, что ты там делаешь, видно, что вся работа у тебя выполняется не во вторичном, а фактически в основном потоке приложения (см. Synchronize(DoWord);)
← →
Pepe (2011-06-19 12:43) [2]
> Даже не вдаваясь в изучение подробностей, что ты там делаешь,
> видно, что вся работа у тебя выполняется не во вторичном,
> а фактически в основном потоке приложения (см. Synchronize(DoWord);
> )
Хм... спасибо за новодку, действительно я видать не так понял документацию по потокам.
Применив Syncronize только к pl.UpdateIndex(CalcItem);
А остальное отправив в Execute зависания пропали, как буд-то их и не было.
Спасибо большое =) Великолепные люди здесь сидят однако, который вопрос уже задаю. Хоть и наводками но.... так даже интереснее искать суть своей проблемы.
← →
Юрий Зотов © (2011-06-19 13:04) [3]if CalcItem = nil then Terminate;
Наверное, здесь надо Exit, а не Terminate.
← →
Loginov Dmitry © (2011-06-19 15:02) [4]
> Открывать одновременно несколько файлов и считывать из них
> достаточно большой объём информации.
Для чего их открывать и считывать одновременно? Думаешь, что одновременная работа окажется быстрее последовательной? Оно да, если имеется несколько подключенных к компьютеру винчестеров, и на каждом - по файлу. Но в рамках одного винчестера параллелизма все равно не добъешься (если конечно файлы не закешируются операционной системой или жестким диском). Более вероятно, что скорость будет ниже, чем при последовательном чтении.
← →
Inovet © (2011-06-19 16:17) [5]> [4] Loginov Dmitry © (19.06.11 15:02)
> Для чего их открывать и считывать одновременно?
Может данные долго обрабатываются по ходу считывания.
← →
Pepe (2011-06-20 08:41) [6]
> Может данные долго обрабатываются по ходу считывания.
Вы совершенно правы. Довольно приличный объём данных считывается в память и потом смещением +1 за цикл обрабатываются. Последовательность в таком случае очень не эффективно смотрится. Это занимает долгое время, если идти метод очередей.
← →
Pepe (2011-06-20 08:42) [7]
> Вы совершенно правы. Довольно приличный объём данных считывается
> в память и потом смещением +1 за цикл обрабатываются. Последовательная
> обработка в таком случае очень не эффективно смотрится.
> Это занимает долгое время, если идти методом очередей.
← →
antonn (work) (2011-06-20 12:30) [8]более того, если вдруг понадобиться читать файл из сети (\\192.168.1.2\c$\file.txt) то перед самим чтением будет неслабый подзависон
← →
tesseract © (2011-06-21 18:02) [9]
> Более вероятно, что скорость будет ниже, чем при последовательном
> чтении.
Зависеть будет и от сложности алгоритма обработки / число процессоров. Ну и отложенное чтение сильно снимает нагрузку.
>
> if Na.ReadData>-1 then
> begin
> PItem(CalcItem)^.Data1:= na.Data1;
> PItem(CalcItem)^.Data2:= na.Data2;
> end;
> pl.UpdateIndex(CalcItem);
А откуда взялся pl ?
Да и держи в помощь : http://sourceforge.net/projects/threadpoolpas/
← →
Ega23 © (2011-06-21 19:49) [10]
> Хм... спасибо за новодку, действительно я видать не так
> понял документацию по потокам.
Дело покойного Архангельского живёт и процветает.
Уже который год.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2011.10.09;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.003 c