Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> помогите с потоками 
:(
    Опции темы
РЮХ
Дата 3.6.2013, 08:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 3.6.2013

Репутация: нет
Всего: нет



В программе есть данные в виде объектов в TObjectList, нужно, например, по нажатию кнопки дописать в (большой) файл данные или изменить там данные. Что-бы было удобнее хочу перенести сохранение в отдельный поток. Нажал сохранить и добавить - он сохраняет, а пользователь дальше без тормозов работает. Про потоки почитал, простые примеры поизучал. Но как сделать реальную задачу пока не пойму. Т.к. файл с данными может быть один, то по идеи поток должет быть один для сохранения. Но сохранить может потребоваться и в тот момент когда уже идет сохранение (пред. не успел сохранится), надо как-то дождаться и дать команду сохранять следом другие данные. Помогите понять как это нужно организовать.
PM MAIL   Вверх
Akella
Дата 3.6.2013, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 8
Всего: 329



Читать до просветления
http://forum.vingrad.ru/forum/topic-60076.html
PM MAIL   Вверх
РЮХ
Дата 3.6.2013, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 3.6.2013

Репутация: нет
Всего: нет



Как раз весь день мучал себя, но просветления нет. Много всего. К концу голова становится квадратной от теории.
Надо чтобы данные сохранялись в отдельных потоках, но потоки ждали предыдущие пока сохранят. Даже не придумаю как лучше подступится.
PM MAIL   Вверх
Чучмек
Дата 3.6.2013, 19:04 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 7
Всего: 41



Цитата(РЮХ @  3.6.2013,  17:06 Найти цитируемый пост)
Надо чтобы данные сохранялись в отдельных потоках, но потоки ждали предыдущие пока сохранят. Даже не придумаю как лучше подступится. 

Один дополнительный поток для сохранения, и задания для него.



--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
Poseidon
Дата 3.6.2013, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 9
Всего: 133



Цитата(РЮХ @  3.6.2013,  17:06 Найти цитируемый пост)
Много всего. К концу голова становится квадратной от теории.Надо чтобы данные сохранялись в отдельных потоках, но потоки ждали предыдущие пока сохранят.
Еще раз более глубоко и вдумчиво читай шестую часть. Акцент на критические секции. 

Тебе надо: 
  • Cоздать класс - наследник TThread (один). Допустим TSaveFileThread
  • В этом классе описать метод сохранения данных в файл. При чем само сохранение засунуть в критическую секцию 
  • На каждое нажатие кнопки "Сохранить" создавать объект этого класса (грубо говоря, создавать поток и запускать его)
Цитата
Важно, что у критической секции в каждый момент времени может быть только один поток-владелец. Если поток пытается войти в критическую секцию, когда другой поток уже находится внутри нее, то он будет приостановлен, и возобновит свою работу, только когда другой поток выйдет из критической секции.


Еще можешь почитать про метод WaitFor. Специально для таких вот задач как у тебя "Надо чтобы данные сохранялись в отдельных потоках, но потоки ждали предыдущие пока сохранят." он и предусмотрен. WaitFor описан в пятой главе

Это сообщение отредактировал(а) Poseidon - 3.6.2013, 19:29


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
РЮХ
Дата 5.6.2013, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 3.6.2013

Репутация: нет
Всего: нет



Не пойму.
В главном модуле завел переменную     
Sync: TRTLCriticalSection;
Создаю поток для сохранения.

Код

    InitializeCriticalSection(Sync);

    Thread := TSaveFileThread.Create(true);
    Thread.FreeOnTerminate := True;
    SetThreadPriority(Thread.Handle, THREAD_PRIORITY_BELOW_NORMAL);
    try
      Thread.D := Data;
    except
      //on EConvertError do FPrimeThread.StartNum := 2;
    end;
    Thread.Resume;


В потоке 
Код

procedure TSaveFileThread.Execute;
begin
      EnterCriticalSection(MainForm.Sync);
      if not (Terminated) then AddDataToFile(D, 'a.data');
      LeaveCriticalSection(MainForm.Sync);
end;


Данные сохраняются но через какое-то время или почему-то получаю ошибку
---------------------------
Debugger Exception Notification
---------------------------
Project My.exe raised exception class EFOpenError with message 'Cannot open file "D:\a.data". Процесс не может получить доступ к файлу, так как этот файл занят другим процессом'.
---------------------------
Break   Continue   Help   
---------------------------


PM MAIL   Вверх
Akella
Дата 5.6.2013, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 8
Всего: 329



Ошибка в 17ой строке.
PM MAIL   Вверх
Poseidon
Дата 5.6.2013, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 9
Всего: 133



Первый код - это OnClick кнопки "Сохранить"? Ты просто скопипастил код или все-таки попытался в нем разобраться? Прочти внимательно 
Цитата
Операции InitializeCriticalSection и DeleteCriticalSection можно рассматривать подобно созданию и освобождению объектов в куче. Обычно имеет смысл проводить действия по созданию и разрушению критических секций в одном потоке, причем в наиболее долгоживущем

В твоем случае самый долгоживущий поток - это основной поток программы.


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
РЮХ
Дата 5.6.2013, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 3.6.2013

Репутация: нет
Всего: нет



Цитата(Akella @  5.6.2013,  16:05 Найти цитируемый пост)
Ошибка в 17ой строке.

?

Цитата(Poseidon @  5.6.2013,  16:36 Найти цитируемый пост)
Первый код - это OnClick кнопки "Сохранить"?

Можно считать так, на деле сложнее, пусть будет щелчок по кнопке или, например, событие таймера.


Цитата(Poseidon @  5.6.2013,  16:36 Найти цитируемый пост)
Ты просто скопипастил код или все-таки попытался в нем разобраться?

Пытаюсь. В примерах он для доступа к данным в главном модуле... Мне же надо другое. Не пойму. Т.к. эта ошибка, значит кусок чтения и записи в файл не блокируется.

Цитата(Poseidon @  5.6.2013,  16:36 Найти цитируемый пост)
Обычно имеет смысл проводить действия по созданию и разрушению критических секций в одном потоке, причем в наиболее долгоживущем. В твоем случае самый долгоживущий поток - это основной поток программы.

Не пойму. Критическая сессия, как я понимаю, открытие и запись в файл. Мне ее наоборот нужно в отдельный поток вынести.
PM MAIL   Вверх
Poseidon
Дата 5.6.2013, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 9
Всего: 133



Цитата(РЮХ @  5.6.2013,  17:28 Найти цитируемый пост)
?

http://forum.vingrad.ru/act-Help/CODE-01/HID-17.html

Цитата(РЮХ @  5.6.2013,  17:28 Найти цитируемый пост)
Не пойму. Критическая сессия, как я понимаю, открытие и запись в файл. Мне ее наоборот нужно в отдельный поток вынести.
Правильно. Только вход в критическую секцию - это EnterCriticalSection и тут у тебя все правильно. А вот инициализация - InitializeCriticalSection - это совсем другое и, вероятнее всего, у тебя инициализируются разные секции.


Это сообщение отредактировал(а) Poseidon - 5.6.2013, 18:56


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
РЮХ
Дата 5.6.2013, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 3.6.2013

Репутация: нет
Всего: нет



Цитата(Poseidon @  5.6.2013,  18:56 Найти цитируемый пост)
А вот инициализация - InitializeCriticalSection - это совсем другое и, вероятнее всего, у тебя инициализируются разные секции.

Перенес в создание главной формы. Так вроде ок. Delete... ее обязательно делать?
PM MAIL   Вверх
Poseidon
Дата 5.6.2013, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 9
Всего: 133



Цитата(РЮХ @  5.6.2013,  22:03 Найти цитируемый пост)
Delete... ее обязательно делать?
Ну а как же? Освобождение ресурсов всегда обязательно делать.



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1243 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.