Главная страница
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.026 c
1-48497
Olegka
2003-09-02 18:38
2003.09.15
Последние 2 вопроса по word и excel


1-48578
Vinter
2003-09-04 09:38
2003.09.15
Полупрозрачная форма


3-48471
Nikkkkk
2003-08-22 17:48
2003.09.15
Опять вопрос по TQuery (и по синтаксису запросов)


3-48447
sash2
2003-08-25 08:12
2003.09.15
Копирование из одного Dbf файла в другой Dbf файл.


7-48809
Dow
2003-06-30 15:06
2003.09.15
Монитор реестра.