Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
6-1116353312
lifo
2005-05-17 22:08
2005.09.04
Консольная программа по передаче файлов


1-1123829613
_Роман_
2005-08-12 10:53
2005.09.04
Компонент построения графиков в Delphi


14-1123534105
GanibalLector
2005-08-09 00:48
2005.09.04
Наш человек ;) Я рыдалЪ


14-1123732274
Думкин
2005-08-11 07:51
2005.09.04
11 августа. С днем рождения.


2-1071249455
iWantToKnow
2003-12-12 20:17
2005.09.04
Вопросы по тематике :)))