Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
1-1268581262
RU-mata
2010-03-14 18:41
2011.10.09
Не срабатываю методы OnClose и OnCloseQuery


15-1308256200
Юрий
2011-06-17 00:30
2011.10.09
С днем рождения ! 17 июня 2011 пятница


15-1308328493
alexdn
2011-06-17 20:34
2011.10.09
по Inno setup


2-1307620113
Дмитрий Белькевич
2011-06-09 15:48
2011.10.09
Синхронизация с основным тредом программы не из TThread


15-1308515398
Юрий
2011-06-20 00:29
2011.10.09
С днем рождения ! 20 июня 2011 понедельник





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский