| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Для новичков > помогите с потоками |
| Автор: РЮХ 3.6.2013, 08:20 |
| В программе есть данные в виде объектов в TObjectList, нужно, например, по нажатию кнопки дописать в (большой) файл данные или изменить там данные. Что-бы было удобнее хочу перенести сохранение в отдельный поток. Нажал сохранить и добавить - он сохраняет, а пользователь дальше без тормозов работает. Про потоки почитал, простые примеры поизучал. Но как сделать реальную задачу пока не пойму. Т.к. файл с данными может быть один, то по идеи поток должет быть один для сохранения. Но сохранить может потребоваться и в тот момент когда уже идет сохранение (пред. не успел сохранится), надо как-то дождаться и дать команду сохранять следом другие данные. Помогите понять как это нужно организовать. |
| Автор: Akella 3.6.2013, 10:00 |
| Читать до просветления http://forum.vingrad.ru/forum/topic-60076.html |
| Автор: РЮХ 3.6.2013, 17:06 |
| Как раз весь день мучал себя, но просветления нет. Много всего. К концу голова становится квадратной от теории. Надо чтобы данные сохранялись в отдельных потоках, но потоки ждали предыдущие пока сохранят. Даже не придумаю как лучше подступится. |
| Автор: Poseidon 3.6.2013, 19:27 | ||||
Тебе надо:
Еще можешь почитать про метод WaitFor. Специально для таких вот задач как у тебя "Надо чтобы данные сохранялись в отдельных потоках, но потоки ждали предыдущие пока сохранят." он и предусмотрен. WaitFor описан в http://forum.vingrad.ru/forum/topic-60076/anchor-entry480378/0.html |
| Автор: РЮХ 5.6.2013, 15:47 | ||||
| Не пойму. В главном модуле завел переменную Sync: TRTLCriticalSection; Создаю поток для сохранения.
В потоке
Данные сохраняются но через какое-то время или почему-то получаю ошибку --------------------------- Debugger Exception Notification --------------------------- Project My.exe raised exception class EFOpenError with message 'Cannot open file "D:\a.data". Процесс не может получить доступ к файлу, так как этот файл занят другим процессом'. --------------------------- Break Continue Help --------------------------- |
| Автор: Akella 5.6.2013, 16:05 |
| Ошибка в 17ой строке. |
| Автор: Poseidon 5.6.2013, 16:36 | ||
Первый код - это OnClick кнопки "Сохранить"? Ты просто скопипастил код или все-таки попытался в нем разобраться? Прочти внимательно
В твоем случае самый долгоживущий поток - это основной поток программы. |
| Автор: РЮХ 5.6.2013, 17:28 | ||||
? Можно считать так, на деле сложнее, пусть будет щелчок по кнопке или, например, событие таймера.
Пытаюсь. В примерах он для доступа к данным в главном модуле... Мне же надо другое. Не пойму. Т.к. эта ошибка, значит кусок чтения и записи в файл не блокируется.
Не пойму. Критическая сессия, как я понимаю, открытие и запись в файл. Мне ее наоборот нужно в отдельный поток вынести. |
| Автор: Poseidon 5.6.2013, 18:56 | ||
http://forum.vingrad.ru/act-Help/CODE-01/HID-17.html
|
| Автор: РЮХ 5.6.2013, 22:03 | ||
Перенес в создание главной формы. Так вроде ок. Delete... ее обязательно делать? |
| Автор: Poseidon 5.6.2013, 22:28 |
| Ну а как же? Освобождение ресурсов всегда обязательно делать. |