![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Работа с 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, параметрами передают указатели на структуру с данными, котторые надо записать), и забывают о этом. А оконный обработчик все это дело пишет и освобождает память