Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.09.15;
Скачать: CL | DM;

Вниз

Корректно ли создать в методе TThread.Execute VCL-компоненты?   Найти похожие ветки 

 
Calm ©   (2003-09-02 17:13) [0]

Как известно, для доступа к формам и т.д. из потоков (TTread) необходимо задействовать метод Synchronize. При этом гарантируется, что два потока не обратятся одновременно к одному VCL-объекту. Вроде так, я ничего не напутал?
А можно ли создавать в методе Execute VCL-объект (для каждого потока свой получится) и юзать его? Будет ли это стабильно работать?

Вообще, задача такова.
С внешнего устройства на COM-порт поступают данные. Поступают достаточно часто. Как только данные считаны, я хочу создать поток, который их обработает и внесент соответствующие записи в БД. Поскольку в пиковые моменты нагрузки данные могут поступать очень часто, то хочется вести обработку и запись в БД в отдельных потоках. Для доступа к БД нужно создавать в run-time компоненты TADOConnection и TADOCommand.

Такие дела...
Буду благодарен за советы :)


 
Юрий Федоров ©   (2003-09-02 17:15) [1]

Если в конструктор компонента параметром передавать nil, то наверно проблем быть не должно. Хотя смотря как они реализованы, эти компоненты...


 
han_malign ©   (2003-09-02 17:20) [2]

Using the main VCL/CLX thread
.......................................
Data access components are thread-safe as follows: For BDE-enabled datasets, each thread must have its own database session component. The one exception to this is when you are using Microsoft Access drivers, which are built using a Microsoft library that is not thread-safe. For dbExpress, as long as the vendor client library is thread-safe, the dbExpress components will be thread-safe. ADO and InterBaseExpress components are thread-safe.
When using data access components, you must still wrap all calls that involve data-aware controls in the Synchronize method. Thus, for example, you need to synchronize calls that link a data control to a dataset by setting the DataSet property of the data source object, but you don"t need to synchronize to access the data in a field of the dataset.

For more information about using database sessions with threads in BDE-enabled applications, see Managing multiple sessions


 
Polevi ©   (2003-09-02 17:25) [3]

>Calm © (02.09.03 17:13)
все нормально будет, не забудь только

procedure TMyThread.Execute;
begin
CoInitialize(nil);
try
conn:=TAdoConnection.Create(nil);
ds:=TADODataset.Create(nil);
...
...

finally
CoUninitialize;
end;
end;


 
Calm ©   (2003-09-02 17:31) [4]

2 Polevi ©
А как быть с

> When using data access components, you must still wrap all
> calls that involve data-aware controls in the Synchronize
> method.

?
Или это только для тех data-aware controls, которые созданы не в потоке?


 
Polevi ©   (2003-09-02 17:56) [5]

data-aware это всякие гриды, дбкомбо и проч., компоненты доступа к ним не относятся..

то есть
> When using data access components, you must still wrap all
> calls that involve data-aware controls in the Synchronize
> method.
надо переводить так:

если твой адодатасет связан через датасурсе с дбгридом, работать с методами датасета ты можешь только в основгном потоке через Syncronize, иначе вызов метода (к примеру) Next в доп кодовом потоке приведет
к нехорошим последствиям


 
Calm ©   (2003-09-02 19:05) [6]


> data-aware это всякие гриды, дбкомбо и проч., компоненты
> доступа к ним не относятся..

Тьфу, знал же ведь.

Всем большое спасибо :)



Страницы: 1 вся ветка

Текущий архив: 2003.09.15;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.033 c
14-48786
выарп
2003-08-23 19:49
2003.09.15
Кто знает формат .bmp, помогите.


6-48673
Maxim Pshevlotsky
2003-07-11 06:54
2003.09.15
TIDFTP.LIST - Отличия присылаемых строк Windows и Linux


14-48724
jack128
2003-08-28 00:12
2003.09.15
Именинники 28 августа


14-48748
gregi
2003-08-27 02:15
2003.09.15
Подскажите


1-48506
alex732
2003-09-02 15:18
2003.09.15
Различный цвет и стиль шрифта