delphi: Многопоточное редактирование memo и richedit

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Mixon, 10 Oct 2012.

  1. Mixon

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

    Joined:
    12 Mar 2008
    Messages:
    394
    Likes Received:
    119
    Reputations:
    12
    Вторые сутки вожусь с проблемкой, если в memo/rich добавлять строку текста из события (можно назвать многопоточностью), то когда 1е событие текст еще не успело вставить весь а второе уже пришло - то строка обрывается на середине и вставляется вторая, как этого можно избежать???

    Пример лага - создать 2 таймера, который будет через каждые 1ms добавлять строку "привет братва" а вторая "пока чуваки", и получится каша типу "привпока чувпривет братпока"
    Пробовал делать хитрее, ставил условие через переменную типу
    memo_adds:=True;
    memo1.values.add(text);
    memo_adds:=False;

    Если до этого места доходит код и в переменной УЖЕ был true - функция вызывается заново через 10ms, но этот способ временами путает местами строки, ибо если приходит 2-3-5 строчек и уходят "ждать" то друг по перед друга лезут
    + 1 на 50 строчек - всё-же умудряется влезть в предадущую строку, хз как, скорее всего в момент когда переменной присваивается true - проверяется и условие, и в итоге проходят оба..(

    Что посоветуете? мб есть какой-то компонент который сам будет защищать от одновременной передачи нескольких строчек, ставля их в очередь?
     
  2. mironich

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

    Joined:
    27 Feb 2011
    Messages:
    733
    Likes Received:
    73
    Reputations:
    19
    Крит секции?
    Если таймеры в одном потоке, то отлавливой событие(типа мемо готово дальше на себе рисовать), и по нему пиши.
    Типа пула текстов для записи делаешь, и по событию из него пишешь текст.
     
  3. BigBear

    BigBear Escrow Service
    Staff Member Гарант - Escrow Service

    Joined:
    4 Dec 2008
    Messages:
    1,801
    Likes Received:
    920
    Reputations:
    862
    Советую класть строки в StringList и не использовать в потоках графические элементы интерфейса.

    А уже в секции синхронизации присваивать графическим элементам интерфейса текст из переменных типа текст.
     
    _________________________
  4. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    936
    Likes Received:
    162
    Reputations:
    27
    Попробовал - нету никакого лага.
    Не нужны.

    ТС, используй метод Synchronize класса TThread, когда делаешь какую то работу с GUI из дополнительного потока. Никакие дополнительные переменные и т. д., не требуются.