![]() |
|
Модераторы: Snowy, MetalFan, bems, Poseidon |
![]()
|
|
| valerchi |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 163 Регистрация: 27.5.2008 Где: Геническ Репутация: нет Всего: нет |
Мужики, объясните, что происходит... Имею два потока в одном идёт цикл и счётчик записывается в буфер обмена. В другом потоке идёт считывание из буфера обмена и вывод результата в Memo.
После записи в Мемо нескольких чисел вылетает такая ошибка, что делфи вообще глючит, а буфер обмена не работает. Вот мой код, первый поток:
И второй поток
|
||||
|
|||||
| kami |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 22 Всего: 72 |
1. как минимум странно использовать в качестве средства обмена между потоками буфер обмена.
2. Clipboard - синглтон, причем (емнип) не потокобезопасный. Посему - считайте его VCL компонентом, со всеми вытекающими в виде желательной работы через Synchronize. Отсюда могут и глюки расти. А использование Synchronize в контексте приведенного кода полностью сводит на нет все разделение на потоки. Может, обрисуете задачу? Решение выглядит как из неисправной пушки по воробьям... |
|||
|
||||
| valerchi |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 163 Регистрация: 27.5.2008 Где: Геническ Репутация: нет Всего: нет |
Раньше я делал почти так же, только вместо записи в буфер обмена, второй поток записывал результат не в буфер, а в файл, а первый поток считывал информацию из файла, (Своего рода генератор случайных чисел) но это было слишком медленно. Хочу поэкспериментировать, сделать гсч таким образом (с помощью буфера обмена).
|
|||
|
||||
| Poseidon |
|
|||
![]() Delphi developer ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: 9 Всего: 133 |
Буфер обмена - это территория пользователя. Лезть на эту территорию без разрешения - очень не хорошо. Для синхронизации потоков есть достаточное количество инструментов. Вот тут достаточно хорошо описаны средства синхронизации потоков. Делать это через буфер обмена ой как не правильно.
-------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
|||
|
||||
| drkot |
|
|||
![]() Ищущий ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1042 Регистрация: 5.5.2006 Репутация: нет Всего: 8 |
Кроме того, что уже сказано, о плохом тоне такого подхода... могу добавить только причину "глюка".
Первый поток открывает буфер Второй поток открывает буфер (он уже открыт, по сути ничего не происходит) Второй поток пишет в буфер Второй поток закрывает буфер Первый поток читает из буфера (а он уже закрыт, отсюда и глюк) Решение: обернуть работу с буфером в критическую секцию, а учитывая что это TObject, то логичнее использовать TMonitor -------------------- Ошибка не становится истиной по причине широкого распространения, как и Истина не становится Ошибкой из-за того, что никто её не видит. |
|||
|
||||
![]()
|
| Правила форума "Delphi: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |