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

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

Работа с Mutex [D6, D7, Win2k, WinXP]


JohnSmith ©   (2005-07-15 16:28:00) 

Есть массив потоков, каждый из которых должен произвести запись в таблицу (Paradox). При прямой попытке записи в таблицуестественно возникает исключение. Насколько я понимаю, здесь необходимо использовать мьютекс или критическую секцию , но ни одного подробного примера не нашел. Как это можно организовать ?


Digitman   (2005-07-19 15:17:00) [1]


> Может и не является но он относится к контесту именно основного
>  потока


нет не относится !
не обязан потому что ...

мало ли в каком потоке был создан объект TDataSet !

важно лишь то, в каких потоках будут вызываться его методы открытия/закрытия и навигации ...

все остальное (с т.з. синхронизации) - очевидно и примитивно решаемо


tesseract   (2005-07-19 14:15:00) [2]

>> TDataSet НЕ является виз.компонентом  

Может и не является но он относится к контесту именно основного  потока причё запросто связанного с VCL DataAware. Это общая рекомендация к потокам как и Sleep() во время цикла Execute;


Digitman   (2005-07-19 13:47:00) [3]


> tesseract   (19.07.05 13:40) [6]


врешь.

tab есть наследник TDataSet

TDataSet НЕ является виз.компонентом

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


tesseract   (2005-07-19 13:40:00) [4]

> никакой "естественности" возбуждения исключения при этом я не вижу.

Я вижу, общаться с VCL следует в контесте основного потоканадо так Synchronize(DoSmothingWithVCL);
про synchronize - читай в Help Delphi
procedure DoSmothingWithVCL;
begin
tab.FieldByName('qwerty').AsString
end;


Digitman   (2005-07-19 10:35:00) [5]


> JohnSmith   (15.07.05 18:33) [3]


> открываю таблицу, а дальше tab.FieldByName('qwerty').AsString


это НЕ "прямая запись"
это - обращение к св-ву некоего объекта


> потоки открывают таблицу одновременно


никакой "естественности" возбуждения исключения при этом я не вижу


> Access violation ....


а многоточие - это для Пушкина ?
там ведь оч полезная инф-ция для анализа имеется ...


tesseract   (2005-07-19 10:25:00) [6]

Я делаю примерно таким образом. Создаётся очередь (используется класс от EZDSL) в отдельном потоке (там есть ещё и как раз ThreadSafe модель). потом типа этого

crit:TcriticalSection; // Критичесая секция - олжна быть общей для всех потоков
MyQueue:TQueue;
function InitThreads:boolean;
begin
crit:=TcriticalSection.Create;
MyQueue:=Tqueue.create(true);
if crit<> nil then result:=true else result:=false;
end;

procedure CloseThreads;
begin
crit.release;
crit.Free;
MyQueue.Empty;
MyQueue.Free;
end;
// Сброс данных на

function MyOtherThread.Execute;
begin
crit.aquire;
try
 MyQueue.Append(MyData);
finally
crit.release;
end;
end;


JohnSmith   (2005-07-15 18:33:00) [7]

>>что есть "прямая запись в таблицу" ?
просто открываю таблицу, а дальше tab.FieldByName('qwerty').AsString:='qazqaz';

>>почему "естественно" ?
потоки открывают таблицу одновременно

>>какое конкретно "исключение" ?
Access violation ....


Digitman   (2005-07-15 16:47:00) [8]


> При прямой попытке записи в таблицуестественно возникает
> исключение


что есть "прямая запись в таблицу" ?
почему "естественно" ?
какое конкретно "исключение" ?


Гаврила   (2005-07-15 16:39:00) [9]

Я бы сделал так.
Потоки отправляют на Handle окна сообщение (PostMessage, параметрами передают указатели на структуру с данными, котторые надо записать), и забывают о этом. А оконный обработчик все это дело пишет и освобождает память


Наверх

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