Форум: "Начинающим";
Текущий архив: 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.083 c