![]() |
Модераторы: Snowy, MetalFan, bems, Poseidon |
![]() ![]() ![]() |
|
РЮХ |
|
|||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 3.6.2013 Репутация: нет Всего: нет |
В программе есть данные в виде объектов в TObjectList, нужно, например, по нажатию кнопки дописать в (большой) файл данные или изменить там данные. Что-бы было удобнее хочу перенести сохранение в отдельный поток. Нажал сохранить и добавить - он сохраняет, а пользователь дальше без тормозов работает. Про потоки почитал, простые примеры поизучал. Но как сделать реальную задачу пока не пойму. Т.к. файл с данными может быть один, то по идеи поток должет быть один для сохранения. Но сохранить может потребоваться и в тот момент когда уже идет сохранение (пред. не успел сохранится), надо как-то дождаться и дать команду сохранять следом другие данные. Помогите понять как это нужно организовать.
|
|||
|
||||
Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 8 Всего: 329 |
||||
|
||||
РЮХ |
|
|||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 3.6.2013 Репутация: нет Всего: нет |
Как раз весь день мучал себя, но просветления нет. Много всего. К концу голова становится квадратной от теории.
Надо чтобы данные сохранялись в отдельных потоках, но потоки ждали предыдущие пока сохранят. Даже не придумаю как лучше подступится. |
|||
|
||||
Чучмек |
|
|||
НЭТ БИЛЭТ ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 11.5.2008 Где: СССР Репутация: 7 Всего: 41 |
Один дополнительный поток для сохранения, и задания для него. -------------------- умную мысль держи при себе, а дурной - поделись с другими |
|||
|
||||
Poseidon |
|
||||
![]() Delphi developer ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: 9 Всего: 133 |
Тебе надо:
Еще можешь почитать про метод WaitFor. Специально для таких вот задач как у тебя "Надо чтобы данные сохранялись в отдельных потоках, но потоки ждали предыдущие пока сохранят." он и предусмотрен. WaitFor описан в пятой главе Это сообщение отредактировал(а) Poseidon - 3.6.2013, 19:29 -------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
||||
|
|||||
РЮХ |
|
||||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 3.6.2013 Репутация: нет Всего: нет |
Не пойму.
В главном модуле завел переменную Sync: TRTLCriticalSection; Создаю поток для сохранения.
В потоке
Данные сохраняются но через какое-то время или почему-то получаю ошибку --------------------------- Debugger Exception Notification --------------------------- Project My.exe raised exception class EFOpenError with message 'Cannot open file "D:\a.data". Процесс не может получить доступ к файлу, так как этот файл занят другим процессом'. --------------------------- Break Continue Help --------------------------- |
||||
|
|||||
Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 8 Всего: 329 |
Ошибка в 17ой строке.
|
|||
|
||||
Poseidon |
|
|||
![]() Delphi developer ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: 9 Всего: 133 |
Первый код - это OnClick кнопки "Сохранить"? Ты просто скопипастил код или все-таки попытался в нем разобраться? Прочти внимательно
В твоем случае самый долгоживущий поток - это основной поток программы. -------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
|||
|
||||
РЮХ |
|
|||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 3.6.2013 Репутация: нет Всего: нет |
? Можно считать так, на деле сложнее, пусть будет щелчок по кнопке или, например, событие таймера.
Пытаюсь. В примерах он для доступа к данным в главном модуле... Мне же надо другое. Не пойму. Т.к. эта ошибка, значит кусок чтения и записи в файл не блокируется. Не пойму. Критическая сессия, как я понимаю, открытие и запись в файл. Мне ее наоборот нужно в отдельный поток вынести. |
|||
|
||||
Poseidon |
|
|||
![]() Delphi developer ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: 9 Всего: 133 |
http://forum.vingrad.ru/act-Help/CODE-01/HID-17.html
Это сообщение отредактировал(а) Poseidon - 5.6.2013, 18:56 -------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
|||
|
||||
РЮХ |
|
|||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 3.6.2013 Репутация: нет Всего: нет |
||||
|
||||
Poseidon |
|
|||
![]() Delphi developer ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: 9 Всего: 133 |
Ну а как же? Освобождение ресурсов всегда обязательно делать.
-------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
|||
|
||||
![]() ![]() ![]() |
Правила форума "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. |