Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.05.18;
Скачать: [xml.tar.bz2];

Вниз

потоки   Найти похожие ветки 

 
Dennis I. Komarov ©   (2008-04-16 16:33) [40]

> [39] Аврам   (16.04.08 16:30)

А почему инфа должна храниться на форме?


 
Аврам   (2008-04-16 16:35) [41]

ну если создать tstringlist - то это тоже будет объект формы....но я не уверен, потому и спрашиваю.


 
Dennis I. Komarov ©   (2008-04-16 16:46) [42]

> [41] Аврам   (16.04.08 16:35)

Кто заставляет там хранить данные

+

[38]


 
Palladin ©   (2008-04-16 16:58) [43]


> ANB
> А перво-наперво : не обращайся из потоков к объектам на
> форме.

обоснуй. я вот обращаюсь...


> Аврам

если ты хочешь устроить "царя горы" давай сразу проясним количественную составляющую потоков. сколь много может поступить данных с одинаковым P?


 
Аврам   (2008-04-16 17:02) [44]

с одинаковым p ~ 100-150.

если не хранит даныне на форме то где и как? то что нельзя обращаться к vcl я слышал много раз, а почему и как правильно не видел нигде)))))


 
Palladin ©   (2008-04-16 17:06) [45]


> с одинаковым p ~ 100-150.

ok, если это так... дальше, алгоритм обработки линейный или циклический?


 
Аврам   (2008-04-16 17:14) [46]

затрудняюсь сказать, так как плохо понимаю терминологию. (не знаю просто).


 
Palladin ©   (2008-04-16 17:16) [47]


> Аврам   (16.04.08 17:14) [46]

циклы for to do, while do, repeat until используются в вычислениях или одна только формула?


 
Palladin ©   (2008-04-16 17:21) [48]

я просто хочу выяснить, на сколько тяжел весь алгоритм в целом и есть ли в нем контрастно тяжеленные места?


 
Dennis I. Komarov ©   (2008-04-16 17:22) [49]

> [48] Palladin ©   (16.04.08 17:21)

Партизаны не сдаются!!!


 
Аврам   (2008-04-16 17:25) [50]

забыл сказать еще одну важную весчь,в одном месте еще есть загрузка некоторых данных с интернета (есть сервер с данными, которые постоянно меняются).
это выглядит так page := get(***);в page загружается страница и беруться оттуда некоторые данные парсингом.


 
Аврам   (2008-04-16 17:26) [51]

к сожалению я не все исходные тексты могу выкладывать.


 
Palladin ©   (2008-04-16 17:33) [52]


> Аврам   (16.04.08 17:26) [51]

я не прошу тебя выкладывать тексты... раз ты определить распределение тяжести по алгоритму не в состоянии, то придется в нем на каждый чих с данными (практически через каждую строчку) вставлять следующее
If Terminated Then Exit; , а так же окаймить метод execute скобками try finally end, для корректного освобождения взятых в процессе ресурсов при exit

ты готов к этому?


 
Аврам   (2008-04-16 17:35) [53]

готов.
я предпологал что есть возможность послать группе потоков принудительный выход, ьез использования If Terminated Then Exit;


 
Palladin ©   (2008-04-16 17:37) [54]


> Аврам   (16.04.08 17:35) [53]

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

хорошо раз готов, жди...


 
Dennis I. Komarov ©   (2008-04-16 17:38) [55]

> [51] Аврам   (16.04.08 17:26)

50 постов спустя появляются все новые и новые исходные :(


 
Palladin ©   (2008-04-16 18:38) [56]

Type
TWorkThread=Class(TThread)
 Private
  m_theEndFlagP:TMultiReadExclusiveWriteSynchronizer;
  m_bEndFlag:Boolean;
  m_pData:Pointer;
  m_theData:TStringList;

  Function lcGetEndFlag:Boolean;
 Protected
  Procedure Execute; Override;
 Public
  Constructor Create(Const p_theData:TStrings);
  Destructor Destroy; Override;

  Property EndFlag:Boolean Read lcGetEndFlag;
  Property Data:Pointer Read m_pData;
End;

TMonitorThread=Class(TThread)
 Private
  m_theStringGrid:TStringGrid;
  m_nDropLinesTo:Integer;
  Procedure DropLines;
 Protected
  Procedure Execute; Override;
 Public
  Constructor Create(p_theStringGrid:TStringGrid);
End;

Constructor TWorkThread.Create;
Begin
m_theEndFlagP:=TMultiReadExclusiveWriteSynchronizer.Create;
m_theData:=TStringList.Create;
m_theData.AddStrings(p_theData);
m_bEndFlag:=False;
Inherited Create(False);
End;

Destructor TWorkThread.Destroy;
Begin
Inherited;
m_theData.Free;
m_theEndFlagP.Free;
End;

Procedure TWorkThread.Execute;
Var
i:Integer;
Begin
// берем ресурсы
Try
 For i:=0 to Random(10*1000)-1 Do
  Begin
   Sleep(100); // создаем видимость работы в поте интерфейса
   If Terminated Then Exit;
  End;

 m_theEndFlagP.BeginWrite;
 Try
  m_bEndFlag:=True;
 Finally
  m_theEndFlagP.EndWrite;
 End;
Finally
 // освобождаем ресурсы
End;
End;

Function TWorkThread.lcGetEndFlag;
Begin
m_theEndFlagP.BeginRead;
Try
 Result:=m_bEndFlag;
Finally
 m_theEndFlagP.EndRead;
End;
End;

Const
CONST_NOMER_OF_COLUMN_WITH_P=1;

Procedure TMonitorThread.Execute;
Var
theListOfThreads:TList;

Procedure _FreeThreadsList;
Var
 i:Integer;
Begin
 For i:=0 to theListOfThreads.Count-1 Do TThread(theListOfThreads).Free;
 theListOfThreads.Clear;
End;

Function _CreateThreads:Boolean;
Var
 n,P:Integer;
Begin
 Result:=m_theStringGrid.RowCount<>0;
 If Not Result Then Exit;
 n:=0;
 P:=StrToInt(m_theStringGrid.Cells[CONST_NOMER_OF_COLUMN_WITH_P,n]);
 While True Do
  Begin
   Result:=Not Terminated;
   If Not Result Then Exit;
   theListOfThreads.Add(TWorkThread.Create(m_theStringGrid.Rows[n])); Inc(n);
   If (n=m_theStringGrid.RowCount) Then Begin m_nDropLinesTo:=n-1; Exit; End Else
   If StrToInt(m_theStringGrid.Cells[CONST_NOMER_OF_COLUMN_WITH_P,n])<>P Then Begin m_nDropLinesTo:=n-1; Exit; End;
  End;
End;

Function _WaitForThreads:Boolean;
Var
 i:Integer;
Begin
 i:=0;
 While True Do
  Begin
   Result:=Terminated;
   If Result Then Exit;
   If TWorkThread(theListOfThreads[i]).EndFlag Then
    Begin
     ChegoNibudDelaemS(TWorkThread(theListOfThreads[i]).Data);
     Exit;
    End;
   If i=theListOfThreads.Count Then i:=0;
   Sleep(100);
  End;
End;

Begin
theListOfThreads:=TList.Create;
Try
 While True Do
  Begin
   If Terminated Then Exit;
   m_nDropLinesTo:=-1;
   If Not _CreateThreads Then Exit;
   If _WaitForThreads Then Exit;
   Synchronize(DropLines);
   _FreeThreadsList;
  End;
Finally
 _FreeThreadsList;
 theListOfThreads.Free;
End;
End;

Constructor TMonitorThread.Create;
Begin
m_theStringGrid:=p_theStringGrid;
Inherited Create(False);
End;

Procedure TMonitorThread.DropLines;
Var
j,i:Integer;
Begin
If m_nDropLinesTo=-1 Then Exit;
For i:=m_nDropLinesTo to m_theStringGrid.RowCount-1 Do
 For j:=0 to m_theStringGrid.ColCount-1 Do
  With m_theStringGrid Do Cells[j,i-m_nDropLinesTo]:=Cells[j,i];
With m_theStringGrid Do RowCount:=RowCount-m_nDropLinesTo;
End;


сюда еще нужно будет прикрутить оповещение монитора об уничтожении источника данных, TStringGrid"а

вроде бы нигде не ошибся...


 
Аврам   (2008-04-16 19:27) [57]

вах...спасибо! щас буду разбираться...))


 
Palladin ©   (2008-04-16 19:30) [58]


> вроде бы нигде не ошибся...

все таки ошибся... пропустил Inc(i) в Function _WaitForThreads:Boolean;


 
Аврам   (2008-04-16 19:53) [59]

Palladin, код который ты привел нужно вставлять в основном приложении или в отдельно созданном уните - потоке ?


 
Palladin ©   (2008-04-16 19:54) [60]


> Аврам   (16.04.08 19:53) [59]

куда хочешь туда и вставляй...


 
sniknik ©   (2008-04-16 20:08) [61]

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


 
Аврам   (2008-04-16 20:25) [62]

sniknik, не тебе судить что лучше, если хочешь помочь, то помагай - буду благодарен, а говорить о том чего не знаешь - не стоит. Думаю ты меня понял. Чтобы подобные советы "нанять программиста" и нафига доп. комп. тут больше не обсуждались разъесню немного. Данные будут считыватья в течении 5-8 часов, и нужно постоянно наблюдать за происходящим. (получение результатов). Нашелся никем не используемый компьютер. вот его под это дело и дали. К этйо теме кол-во ком. и его мощность никак не относиться.
Спасибо всем за ответы и за советы.
Учусь. С уважением, А.


 
Palladin ©   (2008-04-16 20:29) [63]


>sniknik©(16.04.08 20:08) [61]

не все так безсмысленно, аффтар упомянул о получении данных по http, а это уже совсем другой разговор...


 
Аврам   (2008-04-16 20:42) [64]

Palladin, разбираюсь в коде, который ты мне дал, хочу понять что к чему.
Не все понятно, поэтому я постараюсь описать то что ты мне дал, а ты меня поправишь если что не так :)))

Поток TMonitorThread - это поток, который будет следить за потоками.
TWorkThread - поток, который берет данные из грида и обрабатывает их.

сначала я должен создать поток TMonitorThread и дать ему на съедение stringgrid:
var
 new:TMonitorThread;
begin
 new := TMonitorThread.Create(StringGrid1);
 try
    with new do
    begin
      Resume;
    end;
  except on EConvertError do
    begin
      new.Free;
      ShowMessage("That is not a valid number!");
    end;
  end;


дальше я должен создать потоки TWorkThread.
pot :=TWorkThread.Create(StringGrid1.Cols[0]);
  try
    with pot do
    begin
      Resume;
    end;
  except on EConvertError do
    begin
      pot.Free;
      ShowMessage("That is not a valid number!");
    end;
  end;

//ChegoNibudDelaemS(TWorkThread(theListOfThreads[i]).Data); закоментировал так как пока не знаю что здесь будет.

чувствую что делаю неправильно)


 
Palladin ©   (2008-04-16 20:45) [65]

звиняй, лекция будет уже только завтра... но будет


 
Аврам   (2008-04-16 20:57) [66]

спасибо, договорились ))


 
sniknik ©   (2008-04-16 21:08) [67]

> не все так безсмысленно, аффтар упомянул о получении данных по http, а это уже совсем другой разговор...
откуда угодно, stringgrid не для обработки данных, отображать, и только часть (!)  еще куда ни шло, да и то, гораздо для этого предпочтительнее dbgrig + dataset под данные.


 
Аврам   (2008-04-16 21:37) [68]

sniknik, у меня же не БД, анализируемые данные в дальнейшем ненужны.


 
Palladin ©   (2008-04-16 22:05) [69]


>sniknik©(16.04.08 21:08) [67]

про StringGrid согласен, но лично я бы заменил на ListView в виртульном режиме...


 
Palladin ©   (2008-04-16 22:05) [70]

:) тьфу блин, в виртуальном


 
sniknik ©   (2008-04-16 22:56) [71]

> но лично я бы заменил на ListView в виртульном режиме...
dataset быстрее и функциональнее. вот как в ListView будеш делать сортировку? (понятно не в самом, раз в виртуальном, а в том динамическом массиве что "под ним")
а индексы поддерживать? нужен быстрый поиск значения? фильтрация данных? и т.д.
dataset готовый компонент по работе с данными. в других же многое будет "велосипедоизобретательством".


 
Palladin ©   (2008-04-16 23:19) [72]

я тебя умоляю... при чем здесь индексирование? что ты индексировать собрался тут? быстрый поиск значения... какого значения? фильтрация данных... какая еще фильтрация? чего ты тут фильтровать то собрался?

а со своим любимым датасетом ты реально обвешиваешь набор входящих данных для расчета нафик никому ненужным функционалом... пойми, речь идет об fifo...


 
Palladin ©   (2008-04-16 23:23) [73]

хотя на счет fifo может быть я и неправ... надо будет завтра у аффтора уточнить происхождение данных и критичность упорядоченности при вхождении на обработку...


 
Palladin ©   (2008-04-16 23:29) [74]

в любом случае я тебе обеспечу производительность работы с данными в виртуальном режиме ListView гораздо более производительную чем при использовании DataSet"а


 
Аврам   (2008-04-16 23:53) [75]


>  надо будет завтра у аффтора уточнить происхождение данных
> и критичность упорядоченности при вхождении на обработку.
> ..

данные генеряться на этапе-1. критичность не важна, они и так поступают в определенном порядке и далее идут на обработку.
то о чем мы здесь говорим и о чем эта тема - это этап-2.


 
sniknik ©   (2008-04-17 00:30) [76]

> при чем здесь индексирование? что ты индексировать собрался тут? быстрый поиск значения... какого значения?
намеки на повторяющиеся до 100 раз поиски значения одной записи в других есть в > Аврам   (16.04.08 16:07) [34]
без индексов тяжелый поиск будет.

> фильтрация данных... какая еще фильтрация?
обычная. нужно например поиск этой кучи из 100 значений в данных, накладываешь фильтр вместо многочисленных поисков и получаешь нужное сразу.

> чего ты тут фильтровать то собрался?
вообщето ничего... (процесс "обработки" как был тайной так и остался. и, думаю останется)
но, были бы данные, а что из них фильтровать, найдется. данные вроде как есть и немало. 100 строк там у него предполагалось вроде, на поток, и 100 потоков. т.е. 10 000 записей.


 
Германн ©   (2008-04-17 01:02) [77]


> Palladin ©   (16.04.08 23:29) [74]
>
> в любом случае я тебе обеспечу производительность работы
> с данными в виртуальном режиме ListView гораздо более производительную
> чем при использовании DataSet"а
>

Тут я скорее поддержу Николая. В большинстве случаев всё уже разработано для БД. Ну а если я не прав, то ты, Тимур, имеешь все шансы на Нобель. :)


 
Аврам   (2008-04-17 01:11) [78]

причем тут фильтрация, индексирование и т.д.
все как делает Palladin как раз то что нужно. никаке бд, и тем более поиск мне не нужен.


 
Германн ©   (2008-04-17 01:47) [79]


> Аврам   (17.04.08 01:11) [78]
>
> причем тут фильтрация, индексирование и т.д.
> все как делает Palladin как раз то что нужно. никаке бд,
>  и тем более поиск мне не нужен.

А ты хто такой? И чего лезешь в дискуссию мастеров?
:)
Не в обиду будь. Ты создал ветку!. Но эта ветка получила иную жизнь.


 
Аврам   (2008-04-17 07:53) [80]

Как минимум автор темы, уже этого хватит. Пожалуйста лишнего на себя не берите. Я не претендую на статус мастера, и о каких обидах вы говорите, просто хамить здесь не зачем, я пришел за помощью на форум "Начинающим".
Как вы любите говорить для того чтобы поболтать сущ. другие разделы раз уж на то пошло.
С уважением, А.



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

Форум: "Начинающим";
Текущий архив: 2008.05.18;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.63 MB
Время: 0.043 c
3-1197395663
DmitrichJ
2007-12-11 20:54
2008.05.18
MySQL, AnyDac Ошибка с max_allowed_packet


2-1208498832
kudatsky
2008-04-18 10:07
2008.05.18
Не создаётся индекс в DBF-файле


2-1208602147
Алексей К.
2008-04-19 14:49
2008.05.18
Чтение параметров из INI-файла


2-1208838989
Виталий____
2008-04-22 08:36
2008.05.18
Прогресс в строке состояния


3-1197297073
Fregl
2007-12-10 17:31
2008.05.18
Ошибка добавления lookup поля в TADOTable





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский