lst.LoadFromFile lst.SaveToFile lst.Clear lst.Add lst.Insert и т.д. Не придется переписывать алго, т.к. прототипы те же, а скорости прибавит потому, что не производится никакой графической отрисовки.
Code: for i:= 0 to sMemo2.Lines.Count - 1 do if pos(sEdit2.Text, sMemo2.Lines[i])=0 then sMemo3.Lines.Add(sMemo2.Lines[i]); вот тут как заменить мемо именно в цикле?
потоки Не получается синхронизировать потоки. Суть.. сначала выполняется цикл for а потом Repeat. оброботчик вот так работает всего 1 поток. с одним циклом знаю как зделать а вот с двумя не знаю.
Главная ошибка - твоя ThreadFunc не имеет параметров. Ведь эта функция будет работать в 10и экземплярах и нужно будет передать 10 разных параметров. Так же не ясно что такое cs Как минимум ее нужно описать следующим образом: procedure MThread.Execute(host:string); //для передачи строки, содержащей host, которую в последствии обрабатывает твоя функция pars.
cs это критическая секция спасибо поробую. сделал так: дает ошибку abstract error процедура pars(host) собирает ссылки со страницы и вносит в treeview и потом pars(host) берет с treeview ссылки так смысл создавать такую функцию.Это происходит внутри потоков
Если честно, мне не ясен твой подход. Чем обусловлено использование критической секции, какой прототип у TMThread и почему не используется CreateThread для создания потока, либо дельфовая обертка BeginThread? Если процедура pars(host) собирает ссылки со страницы, а потом pars(host) берет с treeview ссылки, то так же нужно переработать данную функцию и добавить ей как минимум один параметр, в котором будет передаваться указатель на объект treeview. Или же treeview, создается динамически, внутри pars(host)?
Ммм... что можно сделать: 1. Можно завести глобальные переменные для экземпляра потока 2. Поток создавать в приостановленном состоянии 3. Задать параметры TMThread[Thread1].Property := Something; 4. Запустить поток TMThread[Thread1].Start;
да это понятно я не могу синхронизироать,там по 10 экземпляров идет.С одним циклом без проблем но мне нужен еще цикл repeat.Вообщем рекурсивный сбор (нашел -добавил и снова по всем, пока в TreeView не будет добавлений until a=Form1.Treeview2.Items.Count -1;).
Вот кстати, самая большая ошибка - это обращение из потоков к форме напрямую. Для общения с формой из потоков проще всего использовать SendMessage и обрабатывать поступающие сообщения на форме. При необходимости что-то делать или отдавать данные обратно.
Вот с одним циклом, работает отлично: как создать условие что прошли раз и начали с начала и пока есть добавление в TreeView продолжать цикл.(уже мозг кипит)
Попробуйте так: Code: \\ глобальные переменные var acc1: integer; // Позицыя Treeview2 Th_Count: integer; // Счетчик потоков procedure MThread.Execute; var TV2Pos: integer; parshost: string; begin cs.Enter; inc(Th_Count); cs.Leave; repeat cs.Enter; TV2Pos:= acc1; inc(acc1); if TV2Pos < Form1.Treeview2.Items.Count -1 then begin parshost:= ''; if copy(Form1.Treeview2.Items.Item[TV2Pos].Text,1,1)='/' then parshost:=host1+Form1.Treeview2.Items.Item[TV2Pos].Text; if copy(Form1.Treeview2.Items.Item[TV2Pos].Text,1,4)='http' then parshost:=Form1.Treeview2.Items.Item[TV2Pos].Text; end else parshost:= ''; cs.Leave; if parshost <> '' then pars(parshost); until (parshost = '') or (Terminated); cs.Enter; dec(Th_Count); cs.Leave; end; Перед запуском потоков в Treeview2 должны быть записи. acc1:= 0; // Позиция Treeview2 Th_Count:= 0; // Счетчик потоков
к сожелению не работает.. создает кучу потоков по одному линку и в бесконечный цикл. опечатка? Code: if copy(Form1.Treeview2.Items.Item[TV2Pos].Text,1,1)='/' then [B][COLOR=DarkRed]parshost[/COLOR][/B]:=host1+Form1.Treeview2.Items.Item[TV2Pos].Text; if copy(Form1.Treeview2.Items.Item[TV2Pos].Text,1,4)='http' then [B][COLOR=DarkRed]parshost[/COLOR][/B]:=Form1.Treeview2.Items.Item[TV2Pos].Text; ..... if parshost <> '' then pars([B][COLOR=DarkRed]host[/COLOR][/B]);//правил на pars([B][COLOR=Navy]parshost[/COLOR][/B])
да, опечатка. В Treeview2 записи добавляются? они разные? acc1 растет? acc1 больше нигде не используется?
acc1 растет и нигде не используется больше,записи не добавляются. добавил в глоб. на форме acc1: integer; // Позицыя Treeview2 Th_Count: integer; // Счетчик потоков
зделал такзаменил parshost на host везде) потоки пошли но дубликаты потоков увеличиваются Code: procedure MThread.Execute; var TV2Pos: integer; parshost: string; begin cs.Enter; inc(Th_Count); cs.Leave; repeat cs.Enter; TV2Pos:= acc1; inc(acc1); if TV2Pos < Form1.Treeview2.Items.Count -1 then begin host:= ''; if copy(Form1.Treeview2.Items.Item[TV2Pos].Text,1,1)='/' then host:=host1+Form1.Treeview2.Items.Item[TV2Pos].Text; if copy(Form1.Treeview2.Items.Item[TV2Pos].Text,1,4)='http' then host:=Form1.Treeview2.Items.Item[TV2Pos].Text; end else host:= ''; cs.Leave; if host <> '' then pars(host); Form1.StatusBar1.Panels[5].Text:= 'Ïîòîêè - '+inttostr(acc1); until (host = '') or (Terminated); cs.Enter; dec(Th_Count); cs.Leave; end;
Товарищи! Не могу считать ответ с сайта procedure TForm1.button1.Click(Sender: TObject); var i:integer; PostData:TStringList; html:WideString; Begin for i:= 0 to memo1.Lines.Count-1 do Begin log:=copy(Memo1.Lines[l]); PostData:=TStringList.Create; PostData.Clear; PostData.Add('log_email='+log); PostData.Add('pass=333'); html:=IdHTTP1.Post('www.мегасайт.ру,PostData); if pos 'Email указан неверно" then memo2.lines.add(log); end; end; end.