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

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.009 c
15-1306147225
KSergey
2011-05-23 14:40
2011.10.09
Размышления о связанности процессов


2-1308471338
Pepe
2011-06-19 12:15
2011.10.09
TThread - Хм....Виснет однако....


15-1308169803
Юрий
2011-06-16 00:30
2011.10.09
С днем рождения ! 16 июня 2011 четверг


3-1264681209
mrdoc
2010-01-28 15:20
2011.10.09
Выборка первых записей


4-1251275930
TarenoKostanay
2009-08-26 12:38
2011.10.09
ОС