делфи потоки и stringlist на 1+ лям

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by mazaxaka, 24 Mar 2016.

  1. mazaxaka

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

    Joined:
    15 Feb 2008
    Messages:
    268
    Likes Received:
    35
    Reputations:
    0
    собственно сабж , есть прога на делфи многопоточная, и есть stringlist на пару лямов

    после 50-80к программа просто стопорится, форма не весит(активная) просто нефига не делает

    подскажите в чем может быть проблема?

    логика программы такова

    создание потоков
    Code:
    Button1Click
    for u:=1 to количество do
    begin;
    pThread.Create(false);
    end;
    
    конструктор
    Code:
    constructor pThread.Create(CreateSuspended: Boolean);
    begin
    inherited Create(CreateSuspended);
    FreeOnTerminate := True;
    if not CreateSuspended then
    Resume;
    end;
    
    сам поток
    Code:
    procedure pThread.Execute;
    var
    begin
    while Work do
    TIdTCPClient.Create(nil);
    конект + проверка
    FreeAndNil(Tdp);
    end;
    

    есть еще Sync , она вызывается в потоке для обработки ответа
     
  2. mazaxaka

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

    Joined:
    15 Feb 2008
    Messages:
    268
    Likes Received:
    35
    Reputations:
    0
    нужен конкретный пример, для данной конструкции

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

    подвернулся пример, который я показал выше, интересно по нему узнать
     
  3. alexey-m

    alexey-m Elder - Старейшина

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    mazaxaka, вы все так любите скармливать TStringList файлы с лямами строк, а потом удивляться чего так программа тормозит или не так работает. Сделай ты один поток, который будет обслуживать всю работу с файлом, читая кусочками и раздавая по требованию другим потокам данные, а не весь файл сразу, как это делает TStringList
     
  4. VladimirV

    VladimirV Well-Known Member

    Joined:
    1 Apr 2013
    Messages:
    1,130
    Likes Received:
    6,150
    Reputations:
    57
    mazaxaka
    Вы со строками в TStringList что-то делаете?
    Если используется StringList.Delete(), то возможно из-за этого тормозит.
     
    #4 VladimirV, 24 Mar 2016
    Last edited: 24 Mar 2016
  5. mazaxaka

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

    Joined:
    15 Feb 2008
    Messages:
    268
    Likes Received:
    35
    Reputations:
    0
    TStringList грузится при открытии програмы потом в потоке берет TStringList[номер]
    програма не виснет. а просто стопорится после 50-80к форма активная

    подозреваю что ето может быть из-за обращение в формам из потока
     
  6. mazaxaka

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

    Joined:
    15 Feb 2008
    Messages:
    268
    Likes Received:
    35
    Reputations:
    0
    формы из потоков убрал. в потоке через синхроназацию сохраняется только в файл. но проблемма осталась все таже
     
  7. pravdaru

    pravdaru Member

    Joined:
    5 Dec 2015
    Messages:
    176
    Likes Received:
    47
    Reputations:
    0
    Дык ты представляешь, что внутри творится? Там под каждый твой итем, выделяется память. Потом ты с ней работаешь и т.д. Посмотри, загрузку памяти.
    Кроме того надо посмотреть прородителей TStringList, они не юзают ком объекты? Они тормознутые сами по себе. Я как то на фрилансе делал задачу, обработку 20 млрд записей. Они шли чуть ли не неделю. А я сократил до 4 часов, только потому что, в обход ком объектам exel пошёл.