| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Для новичков > ошибка при чтении из буфера обмена |
| Автор: valerchi 31.8.2014, 12:28 | ||||
| Мужики, объясните, что происходит... Имею два потока в одном идёт цикл и счётчик записывается в буфер обмена. В другом потоке идёт считывание из буфера обмена и вывод результата в Memo. После записи в Мемо нескольких чисел вылетает такая ошибка, что делфи вообще глючит, а буфер обмена не работает. Вот мой код, первый поток:
И второй поток
|
| Автор: kami 31.8.2014, 20:59 |
| 1. как минимум странно использовать в качестве средства обмена между потоками буфер обмена. 2. Clipboard - синглтон, причем (емнип) не потокобезопасный. Посему - считайте его VCL компонентом, со всеми вытекающими в виде желательной работы через Synchronize. Отсюда могут и глюки расти. А использование Synchronize в контексте приведенного кода полностью сводит на нет все разделение на потоки. Может, обрисуете задачу? Решение выглядит как из неисправной пушки по воробьям... |
| Автор: valerchi 31.8.2014, 21:43 |
| Раньше я делал почти так же, только вместо записи в буфер обмена, второй поток записывал результат не в буфер, а в файл, а первый поток считывал информацию из файла, (Своего рода генератор случайных чисел) но это было слишком медленно. Хочу поэкспериментировать, сделать гсч таким образом (с помощью буфера обмена). |
| Автор: Poseidon 1.9.2014, 00:39 |
| Буфер обмена - это территория пользователя. Лезть на эту территорию без разрешения - очень не хорошо. Для синхронизации потоков есть достаточное количество инструментов. http://forum.vingrad.ru/forum/topic-60076.html достаточно хорошо описаны средства синхронизации потоков. Делать это через буфер обмена ой как не правильно. |
| Автор: drkot 13.9.2014, 13:42 |
| Кроме того, что уже сказано, о плохом тоне такого подхода... могу добавить только причину "глюка". Первый поток открывает буфер Второй поток открывает буфер (он уже открыт, по сути ничего не происходит) Второй поток пишет в буфер Второй поток закрывает буфер Первый поток читает из буфера (а он уже закрыт, отсюда и глюк) Решение: обернуть работу с буфером в критическую секцию, а учитывая что это TObject, то логичнее использовать TMonitor |