Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

---|Ветка была без названия|---


Страницы:   1 2 3 4 5 6 7 8

ki11er ©   (2003-03-04 21:11:00) 

приведенный ниже код валится через пару минут работы с сообщениями "Index is out of date" или "Insufficient Memory..." (при 256 оперативки и паре свободных гигах на винте ;-))))
При написании следовал советам, полученным в этой конференции, а так же из других источников. Можно ли написать подобный код так, чтобы он работал без глюков или это принципиально невозможно?

procedure TFormMain.FormCreate(Sender: TObject);
var i: integer;
str_tmp: string;
begin
StartDir := ExtractFilePath(Application.ExeName);
if StartDir[Length(StartDir)] <> "\" then begin
StartDir := StartDir + "\";
end;
sDirDB := StartDir + "dbase\";
CreateDir(sDirDB);
CreateDir(StartDir + "net");
Session.NetFileDir := StartDir + "net";
CreateDir(StartDir + "private");
str_tmp := StartDir + "private\" + IntToStr(GetTickCount);
CreateDir(str_tmp);
Session.PrivateDir := str_tmp;

tbTest.DatabaseName := sDirDB;
qrTest.DatabaseName := sDirDB;

btnStartStop.Caption := "


Mike Kouzmine   (2003-03-07 19:00:00) [41]

Попробуй, как тебе советовали, создавать и TDatabase для каждой таблицы, на нее сессию, а на таблицу этот TDatabase


Mike Kouzmine   (2003-03-07 18:55:00) [42]

Но это на первый взгляд.


Mike Kouzmine   (2003-03-07 18:54:00) [43]

Ты знаешь, надо почитать, в принципе код должен работать, ну кроме
procedure CTestThread.AfterPost(DataSet: TDataSet);
begin
FTable.FlushBuffers;
end;
По идее он должен выкинуть эксепшен что датасет не в Insert or Edit mode


ki11er   (2003-03-07 18:48:00) [44]


> Я не только посмотрел, но и рапечатал и повесил на стенку.
> Но суть-то от этого не меняется.

Т.е. "не верь глазам своим"?


> "одновременно", заметь ковычки

Заметил, это не обсуждается...
В чем разница с точки зрения работы с базой (через BDE) между 2мя процессами и 2мя потоками (за исключением, конечно того, что доп. процесс добавит доп. проблем)?


Mike Kouzmine   (2003-03-07 18:41:00) [45]

Сделай программу, которая будет читать или писать из базы, и запусти ее н раз. Вылетит та же ошибка. Ни на какие мысли не наводит это?


ki11er   (2003-03-07 18:30:00) [46]


> То что спрашивается, то и имеется. Сколько раз происходит
> инициализация BDE?

Я не знаю, что это такое, соответственно ни разу.


Mike Kouzmine   (2003-03-07 18:24:00) [47]

Я не только посмотрел, но и рапечатал и повесил на стенку.
Но суть-то от этого не меняется. Вот если бы ты создал новый процесс и для него инициировал бы бде, то, теоретически, можно было бы производить однотипную операцию "одновременно", заметь ковычки.


ki11er   (2003-03-07 18:24:00) [48]


> То что спрашивается, то и имеется. Сколько раз происходит
> инициализация BDE?

Я не знаю, что это такое, соответственно ни разу.


ki11er   (2003-03-07 18:12:00) [49]


> Разговор идет о том, что многопоточный доступ к файл-серверным
> базам в том виде в котором ты хочешь работать нелогичен
> по своей сути, и по ограничения движка. И дело не в том,
> что есть у тебя ошибка в коде или нет ее, сам вопрос, скажем
> так, не имеет ответа за отсутствием оного.

И еще раз смотрим :-(
http://www.elance.ru/ki11er/Paradox.jpg


Mike Kouzmine   (2003-03-07 18:07:00) [50]

То что спрашивается, то и имеется. Сколько раз происходит инициализация BDE?


ki11er   (2003-03-07 17:58:00) [51]


> Сколько раз инициализируется БДЕ в твоей программе?
> Один раз или несколько?

Что имеется в виду?


Mike Kouzmine   (2003-03-07 17:51:00) [52]

Разговор идет о том, что многопоточный доступ к файл-серверным базам в том виде в котором ты хочешь работать нелогичен по своей сути, и по ограничения движка. И дело не в том, что есть у тебя ошибка в коде или нет ее, сам вопрос, скажем так, не имеет ответа за отсутствием оного.


ki11er   (2003-03-07 17:41:00) [53]

2 Mike Kouzmine & sniknik:
Еще раз смотрим вот сюда:
http://www.elance.ru/ki11er/Paradox.jpg

про стопроцентную нагрузку никто не говорит, это вообще не реализуемо...


Mike Kouzmine   (2003-03-07 17:16:00) [54]

sniknik © > Я читал и полностью согласен, просто хотелось с новыми силами еще раз про это...


sniknik   (2003-03-07 17:00:00) [55]

(писал уже в грохнутой ветке)
можно организовать очередь из сообщений, в принципе ничего терятся не должно.

многопоточный вариант записи в базу, только затормозит процесс, что скорее приведет к потере данных. (оптимум 2 потока 1 на запись и 1 на чтение, было бы ADO то 2 асинхронно работающих компонента)
время выполнения 2х потоков = время одного + время другого + время на переключение, вообще потоки имеют смысл если система простаивает (в режиме ожидания) а несколько со стопроцентной загрузкой не будут быстрее одного.

(надеюсь понятно изложил, its мое мнение, переубеждению не подлежит :-)))

Mike Kouzmine (07.03.03 16:47)
> что многопоточный доступ, что однопоточный, по барабану
я бы даже сказал больше (и сказал :)), что наоборот тормознее будет, с такими потоками.


Mike Kouzmine   (2003-03-07 16:47:00) [56]

Сколько раз инициализируется БДЕ в твоей программе?
Один раз или несколько?
Если один раз, то сколько бы потоков не выполнялось, БДЕ будет писать данные последовательно, то есть сначала обрабаотает один запрос, затем другой... Исходя из этого, что многопоточный доступ, что однопоточный, по барабану. И нет смысла все это городить.
Если бы я писал эту программу, то сделал бы объект, который бы собирал асинхронно данные, а затем в какой-то момент писал бы это все в базу.


ki11er   (2003-03-07 16:39:00) [57]

Новую ветку запретил модератор. Будем мучаться здесь :(

Итак, раз здесь не нашлось любителей решать задачу просто потому, что она не решена без привязки к объектам окружающей действительности, попробую еще раз описать реальную задачу.

1. Есть написанное на Delphi многофункциональное приложение.
2. При работе в одном из режимов возникают проблемы с таблицей (чаще всего с индексами).
3. Работа с таблицей построена через BDE, сама таблица - Paradox.
4. Таблица имеет порядка 20 полей (типы - лонг, стамп, строка, логический). Автоинкремента нет. Один первичный индекс (лонг), 2 вторичных - 1. лонг+лонг; 2. лонг.
5. "Глобально" переделывать приложение (менять БД, менять структуру самого приложения, ...) у меня пока нет никакого желания, а точнее говоря, я не вижу предпосылок для этого, так как согласно документации, все должно работать в существующем варианте с минимальными переделками.
6. Для того, чтобы с горяча не править само приложение было принято решение написать тест, на нем все отработать и потом перенести в целевую программу.
7. Теперь о том, что должна программа в этом режиме делать. С многоканального оборудования асинхронно поступают данные, которые должны заноситься в таблицу достаточно быстро, иначе могут потеряться (при выполнении только этой задачи - запас по времени достаточно большой). Одновременно с этим должна производиться обработка полученной информации. Эта обработка включает в себя относительно длинный SQL-запрос и некоторую модификацию таблицы. Одновременно с этим пользователь может захотеть просмотреть данные, причем имеет возможность настроить достаточно "извращенную" фильтрацию, чтобы соответствующий SQL-запрос тоже выполнялся достаточно долго. При желании, пользователь может модифицировать некоторые поля таблицы (правда это делается достаточно редко). На самом деле все несколько сложнее, но пусть задача будет сформулирована так.
8. Надеюсь, понятно, что основная задача - записать данные, а остальная обработка может идти относительно медленно.

Способы решения:
1. Заставить работать многопоточный вариант.
2. Разграничить доступ потокам через синхронизацию, но появляется риск потерять данные, что не есть хорошо, а очень даже плохо.
3. Буферизовать обращения к таблице с риском войти в "клинч", когда система по каким-то причинам не станет справляться с нагрузкой. А это есть уже совсем нехорошо.

...


Anatoly Podgoretsky   (2003-03-07 14:47:00) [58]

Незачем спам разводить, хватит и одной ветки


ki11er   (2003-03-07 12:20:00) [59]

2 altarasjuk:
не, так не пойдет, я уже писал выше...

2 zacho:
"БД" очень простая - одна таблица ;-))) Опять же об этом писалось выше не один раз. На SQL пробовал - за исключением пары мелких проблем все нормально. Но не хотелось бы из пушки стрелять по комарам ;-)))

2 MsGuns:
Ok. Открою новую и еще раз напишу ;-)))


MsGuns   (2003-03-06 23:37:00) [60]

>ki11er

Было бы, ИМХО, целесообразным хорошенько тебе подумать и как можно конкретнее и внятно сформулировать суть проблемы, не поленившись описать текущую ситуацию и то, что в конце-концов надо получить. Не вдаваясь ни в какие сессии, потоки и прочие детали реализации.
Все это написать в сабже к новой ветке. А эту пора положить в архив. Больно здоровая, а толку - чуть.

С уважением.


Страницы:   1 2 3 4 5 6 7 8

Наверх

Титульная страница Поиск, карта сайта Написать письмо