Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 25.06.2010
Сообщений: 36

Многопоточная запись в TRichEdit

16.11.2010, 16:35. Показов 1652. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток!
Появилась проблема. Есть 2 потока и функция для записи текста в компонент TRichEdit. Все это работает в DLL. При одновременном обращении двух потоков к функции записи текста получается так, что 1-ый поток записывает, а по средине вступает второй поток и предложение обрывается, начинается запись уже второго предложения вторым потоком, после этого первый поток завершает написание своего предложения. Так как синхронизация потоков в DLL не возможна, то для я пытался использовать Критические секции. Ставил в функции в начале вход в критическую секцию, а в конце - выход. Но при таком подходе в Windows вроде все нормально работает, а вот в Linux под wine функция и хост-приложение зависают. Как только убираешь вход и выход из критической секции, зависание пропадает.
Вот содержимое функции записи в TRichEdit:
C++
1
2
3
4
5
6
7
8
9
10
11
12
cr_sec->Acquire();
try {
    rich->SelStart = rich->Text.Length();
    rich->SelAttributes->Color = color[1];
    rich->SelText = text_log;
    rich->SelAttributes->Color = clBlack;
    rich->Lines->Add("****************\r\n");
    SendMessage(rich->Handle, WM_VSCROLL, MAKEWPARAM(SB_BOTTOM,0), 0);
} catch (Exception *E) {
    MessageBox(Application->Handle, E->Message.t_str(), "Error", MB_OK + MB_ICONASTERISK + MB_TASKMODAL);
}
cr_sec->Release();
cr_sec - типа TCriticalSection. Перед этим она успешно инициализирована.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.11.2010, 16:35
Ответы с готовыми решениями:

Изображение в TRichEdit
Добрый вечер! У меня вопрос. У меня на форме RichEdit1, и как мне там заменять ":)" например на какое то изображение? Как например в аське...

TRichEdit и нумерованный список
Привет всем, помогите розобратса с маркерами, под разными символами (по мимо точки чорной другие символы), и с списками арабскими...

TRichEdit сохранение форматирования
Дано: TRichEdit на форме, и список TRichEdit'oв в программе. class TfMain : public TForm { __published: // IDE-managed Components ...

8
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
16.11.2010, 16:37
низя из потока напрямую управлять ГУЯми, какие бы ни ставили критические секции, только через сообщения...
0
0 / 0 / 0
Регистрация: 25.06.2010
Сообщений: 36
16.11.2010, 18:48  [ТС]
Цитата Сообщение от oxotnik Посмотреть сообщение
низя из потока напрямую управлять ГУЯми, какие бы ни ставили критические секции, только через сообщения...
Только через WinAPI + SendMessage? Я правильно Вас понял?
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
16.11.2010, 22:10
Цитата Сообщение от TheSteelRat Посмотреть сообщение
Только через WinAPI + SendMessage? Я правильно Вас понял?
именно
0
0 / 0 / 0
Регистрация: 25.06.2010
Сообщений: 36
17.11.2010, 07:41  [ТС]
oxotnik, а не подскажете, где можно прочитать об этом (почему нельзя управлять GUI элементами через не основной поток)?
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
17.11.2010, 09:12
потому что ими управляет система в потоке GUI. где конкретно это написано - хз, я в msdn-е видел где то.
1
0 / 0 / 0
Регистрация: 25.06.2010
Сообщений: 36
19.11.2010, 03:33  [ТС]
oxotnik, спасибо. Сделал вывод в TRichEdit через чистый WinAPI - всё отлично работает .
А критические секции все равно в таком случае надо использовать?
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
19.11.2010, 09:13
Цитата Сообщение от TheSteelRat Посмотреть сообщение
oxotnik, спасибо. Сделал вывод в TRichEdit через чистый WinAPI - всё отлично работает .
А критические секции все равно в таком случае надо использовать?
кода не видел (нового) но в случае, если общими данными разные потоки не владеют, то не надо
0
0 / 0 / 0
Регистрация: 25.06.2010
Сообщений: 36
19.11.2010, 19:29  [ТС]
Цитата Сообщение от oxotnik Посмотреть сообщение
кода не видел (нового) но в случае, если общими данными разные потоки не владеют, то не надо
В общем если не использовать критические секции, то под виндой все классно работает, а под wine (может просто из-з того что машина там по-слабее) как-то странно строки вставляются - первый поток, при параллельной работе со вторым потоком, вставляет нормально строки, а вот от строк второго потока только какие-то обрубки вставляются.
А если использовать критические секции, то происходит зависание, когда второй поток пытается записать текст в Rich поле. Код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
char *out_text = text.t_str();
    HWND__ *h_Edit = rtf_list->Handle;
 
    EnterCriticalSection(&cr_sec);
    CHARRANGE cr;
    cr.cpMin = 0;
    cr.cpMax = 0;
        // Зависает вот на этом месте, когда второй поток пытается выполнить эту функцию
    SendMessage(h_Edit, EM_EXSETSEL, 0, (LPARAM)&cr);
 
    // В этой же функции используются EM_SETCHARFORMAT и EM_REPLACESEL, но думаю они сути дела не меняют...
 
       //.....
 
    LeaveCriticalSection(&cr_sec);
Критическая секция cr_sec до этого была инициализированна...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.11.2010, 19:29
Помогаю со студенческими работами здесь

Вставка UnicodeString в TRichEdit
Вопрос простой: Как сформировать строку UnicodeString так чтобы при вставке её в TRichEdit применилось форматирование, например цвет...

Нумерация символов в TRichEdit
в TRichEdit следующий текст: 12345 67890 после выполнения кода: RE->SelStart=RE->Text.Pos(L"78"); RE->SelLength=4; ...

Выравнивание текста в TRichEdit
На форме два компонента. TRichEdit и TSpinEdit. Нужно чтобы при изменении значения в TSpinEdit-е изменялся отступ текста в TRichEdit-е....

TRichEdit копирование текста с форматированием
Имеется два TRichEditа, нужно скопировать из второго несколько строк в первый, например строки с 8 по 10, причем форматирование этих строк...

ANSI в TMemo или TRichEdit
Добрый вечер! Как мне выводить дополнительные символы ANSI. Например. Я введу в TMemo alt+NUM7 и там должно вывестись "○",...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru