Текущий архив: 2005.09.04;
Скачать: CL | DM;
Вниз
Работа с Mutex Найти похожие ветки
← →
JohnSmith (2005-07-15 16:28) [0]Есть массив потоков, каждый из которых должен произвести запись в таблицу (Paradox). При прямой попытке записи в таблицуестественно возникает исключение. Насколько я понимаю, здесь необходимо использовать мьютекс или критическую секцию , но ни одного подробного примера не нашел. Как это можно организовать ?
← →
Гаврила © (2005-07-15 16:39) [1]Я бы сделал так.
Потоки отправляют на Handle окна сообщение (PostMessage, параметрами передают указатели на структуру с данными, котторые надо записать), и забывают о этом. А оконный обработчик все это дело пишет и освобождает память
← →
Digitman © (2005-07-15 16:47) [2]
> При прямой попытке записи в таблицуестественно возникает
> исключение
что есть "прямая запись в таблицу" ?
почему "естественно" ?
какое конкретно "исключение" ?
← →
JohnSmith (2005-07-15 18:33) [3]>>что есть "прямая запись в таблицу" ?
просто открываю таблицу, а дальше tab.FieldByName("qwerty").AsString:="qazqaz";
>>почему "естественно" ?
потоки открывают таблицу одновременно
>>какое конкретно "исключение" ?
Access violation ....
← →
tesseract (2005-07-19 10:25) [4]Я делаю примерно таким образом. Создаётся очередь (используется класс от 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;
← →
Digitman © (2005-07-19 10:35) [5]
> JohnSmith (15.07.05 18:33) [3]
> открываю таблицу, а дальше tab.FieldByName("qwerty").AsString
это НЕ "прямая запись"
это - обращение к св-ву некоего объекта
> потоки открывают таблицу одновременно
никакой "естественности" возбуждения исключения при этом я не вижу
> Access violation ....
а многоточие - это для Пушкина ?
там ведь оч полезная инф-ция для анализа имеется ...
← →
tesseract (2005-07-19 13:40) [6]> никакой "естественности" возбуждения исключения при этом я не вижу.
Я вижу, общаться с VCL следует в контесте основного потока надо так Synchronize(DoSmothingWithVCL);
про synchronize - читай в Help Delphi
procedure DoSmothingWithVCL;
begin
tab.FieldByName("qwerty").AsString
end;
← →
Digitman © (2005-07-19 13:47) [7]
> tesseract (19.07.05 13:40) [6]
врешь.
tab есть наследник TDataSet
TDataSet НЕ является виз.компонентом
нет ни какой обязательности синхронизации обращений к объекту дан-класса с осн.трэдом, хотя - не спорю - относиться к сабжу следует крайне осторожно (зависит от условий)
← →
tesseract (2005-07-19 14:15) [8]>> TDataSet НЕ является виз.компонентом
Может и не является но он относится к контесту именно основного потока причё запросто связанного с VCL DataAware. Это общая рекомендация к потокам как и Sleep() во время цикла Execute;
← →
Digitman © (2005-07-19 15:17) [9]
> Может и не является но он относится к контесту именно основного
> потока
нет не относится !
не обязан потому что ...
мало ли в каком потоке был создан объект TDataSet !
важно лишь то, в каких потоках будут вызываться его методы открытия/закрытия и навигации ...
все остальное (с т.з. синхронизации) - очевидно и примитивно решаемо
Страницы: 1 вся ветка
Текущий архив: 2005.09.04;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.049 c