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

Вниз

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

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

Наверх




Память: 0.64 MB
Время: 0.033 c
2-1208284170
smartleds
2008-04-15 22:29
2008.05.18
Подскажите как удалить массив TrackBar-ов


15-1207417988
No_Dead
2008-04-05 21:53
2008.05.18
Мне страшно%> комп живет своей жизнью


2-1208498108
webSQLNeederr
2008-04-18 09:55
2008.05.18
Как увидеть из подфункции переменную из высшей функции?


3-1197011341
Kolan
2007-12-07 10:09
2008.05.18
Есть ли в SQL оператор &amp;laquo;кроме&amp;raquo;?


11-1189437864
Robt
2007-09-10 19:24
2008.05.18
PList