[ Delphi / Pascal ] — начинающим: задаем вопросы (архивная - 2015)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by banned, 6 May 2007.

Thread Status:
Not open for further replies.
  1. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    634
    Likes Received:
    246
    Reputations:
    42
    lst.LoadFromFile
    lst.SaveToFile
    lst.Clear
    lst.Add
    lst.Insert
    и т.д. Не придется переписывать алго, т.к. прототипы те же, а скорости прибавит потому, что не производится никакой графической отрисовки.
     
  2. VulturRe

    VulturRe Member

    Joined:
    9 Dec 2010
    Messages:
    59
    Likes Received:
    6
    Reputations:
    0
    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]);
    вот тут как заменить мемо именно в цикле?
     
    1 person likes this.
  3. VladimirV

    VladimirV Well-Known Member

    Joined:
    1 Apr 2013
    Messages:
    1,130
    Likes Received:
    6,150
    Reputations:
    57
    Code:
    for i:= 0 to lst.Count - 1 do if pos(sEdit2.Text, lst[i])=0 then sMemo3.Lines.Add(lst[i]);
    
     
    1 person likes this.
  4. vasykas

    vasykas Banned

    Joined:
    7 Mar 2011
    Messages:
    963
    Likes Received:
    137
    Reputations:
    37
    потоки

    Не получается синхронизировать потоки.
    Суть..
    сначала выполняется цикл for а потом Repeat.
    оброботчик
    вот так работает всего 1 поток.
    с одним циклом знаю как зделать а вот с двумя не знаю. :(
     
    #9744 vasykas, 1 Mar 2015
    Last edited: 1 Mar 2015
  5. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    634
    Likes Received:
    246
    Reputations:
    42
    Главная ошибка - твоя ThreadFunc не имеет параметров. Ведь эта функция будет работать в 10и экземплярах и нужно будет передать 10 разных параметров.
    Так же не ясно что такое cs

    Как минимум ее нужно описать следующим образом:
    procedure MThread.Execute(host:string); //для передачи строки, содержащей host, которую в последствии обрабатывает твоя функция pars.
     
  6. vasykas

    vasykas Banned

    Joined:
    7 Mar 2011
    Messages:
    963
    Likes Received:
    137
    Reputations:
    37
    cs это критическая секция
    спасибо поробую.
    сделал так:
    дает ошибку abstract error
    процедура pars(host) собирает ссылки со страницы
    и вносит в treeview и потом pars(host) берет с treeview
    ссылки так смысл создавать такую функцию.Это происходит
    внутри потоков
     
    #9746 vasykas, 1 Mar 2015
    Last edited: 1 Mar 2015
  7. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    634
    Likes Received:
    246
    Reputations:
    42
    Если честно, мне не ясен твой подход. Чем обусловлено использование критической секции, какой прототип у TMThread и почему не используется CreateThread для создания потока, либо дельфовая обертка BeginThread?

    Если процедура pars(host) собирает ссылки со страницы, а потом pars(host) берет с treeview ссылки, то так же нужно переработать данную функцию и добавить ей как минимум один параметр, в котором будет передаваться указатель на объект treeview. Или же treeview, создается динамически, внутри pars(host)?
     
  8. vasykas

    vasykas Banned

    Joined:
    7 Mar 2011
    Messages:
    963
    Likes Received:
    137
    Reputations:
    37
    unit2
    извеняюсь необъяснил до конца.
    Unit1 в кратце
    передаю юнит2 параметры host
     
    #9748 vasykas, 1 Mar 2015
    Last edited: 1 Mar 2015
  9. binarymaster

    binarymaster Elder - Старейшина

    Joined:
    11 Dec 2010
    Messages:
    4,717
    Likes Received:
    10,195
    Reputations:
    126
    Ммм... что можно сделать:
    1. Можно завести глобальные переменные для экземпляра потока
    2. Поток создавать в приостановленном состоянии
    3. Задать параметры TMThread[Thread1].Property := Something;
    4. Запустить поток TMThread[Thread1].Start;
     
  10. vasykas

    vasykas Banned

    Joined:
    7 Mar 2011
    Messages:
    963
    Likes Received:
    137
    Reputations:
    37
    да это понятно я не могу синхронизироать,там по 10 экземпляров
    идет.С одним циклом без проблем но мне нужен еще цикл
    repeat.Вообщем рекурсивный сбор (нашел -добавил и снова
    по всем, пока в TreeView не будет добавлений until a=Form1.Treeview2.Items.Count -1;).
     
    #9750 vasykas, 2 Mar 2015
    Last edited: 2 Mar 2015
  11. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    634
    Likes Received:
    246
    Reputations:
    42
    Рефакторинг кода нужен. Синхронизация потоков через критическую секцию не подойдет.
     
  12. binarymaster

    binarymaster Elder - Старейшина

    Joined:
    11 Dec 2010
    Messages:
    4,717
    Likes Received:
    10,195
    Reputations:
    126
    Вот кстати, самая большая ошибка - это обращение из потоков к форме напрямую.

    Для общения с формой из потоков проще всего использовать SendMessage и обрабатывать поступающие сообщения на форме. При необходимости что-то делать или отдавать данные обратно.
     
    1 person likes this.
  13. vasykas

    vasykas Banned

    Joined:
    7 Mar 2011
    Messages:
    963
    Likes Received:
    137
    Reputations:
    37
    Вот с одним циклом, работает отлично:
    как создать условие что прошли раз и начали с начала и
    пока есть добавление в TreeView продолжать цикл.(уже мозг кипит)
     
    #9753 vasykas, 2 Mar 2015
    Last edited: 2 Mar 2015
  14. VladimirV

    VladimirV Well-Known Member

    Joined:
    1 Apr 2013
    Messages:
    1,130
    Likes Received:
    6,150
    Reputations:
    57
    Попробуйте так:
    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; // Счетчик потоков
     
    #9754 VladimirV, 3 Mar 2015
    Last edited: 3 Mar 2015
  15. vasykas

    vasykas Banned

    Joined:
    7 Mar 2011
    Messages:
    963
    Likes Received:
    137
    Reputations:
    37
    к сожелению не работает..
    создает кучу потоков по одному линку и в бесконечный цикл.
    опечатка?
    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])
    
     
    #9755 vasykas, 3 Mar 2015
    Last edited: 3 Mar 2015
  16. VladimirV

    VladimirV Well-Known Member

    Joined:
    1 Apr 2013
    Messages:
    1,130
    Likes Received:
    6,150
    Reputations:
    57
    да, опечатка.
    В Treeview2 записи добавляются? они разные?
    acc1 растет?
    acc1 больше нигде не используется?
     
    #9756 VladimirV, 3 Mar 2015
    Last edited: 3 Mar 2015
    1 person likes this.
  17. vasykas

    vasykas Banned

    Joined:
    7 Mar 2011
    Messages:
    963
    Likes Received:
    137
    Reputations:
    37
    acc1 растет и нигде не используется больше,записи не добавляются.
    добавил в глоб. на форме
    acc1: integer; // Позицыя Treeview2
    Th_Count: integer; // Счетчик потоков
     
  18. vasykas

    vasykas Banned

    Joined:
    7 Mar 2011
    Messages:
    963
    Likes Received:
    137
    Reputations:
    37
    зделал так:(заменил 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;
    
     
  19. F1shka

    F1shka Elder - Старейшина

    Joined:
    10 Apr 2008
    Messages:
    173
    Likes Received:
    305
    Reputations:
    3
    Товарищи! Не могу считать ответ с сайта
    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.
     
  20. vasykas

    vasykas Banned

    Joined:
    7 Mar 2011
    Messages:
    963
    Likes Received:
    137
    Reputations:
    37
    h_ttp://www.cyberforum.ru/delphi-networks/thread383706.html
     
Thread Status:
Not open for further replies.