Форум: "Основная";
Текущий архив: 2003.09.15;
Скачать: [xml.tar.bz2];
ВнизКорректно ли создать в методе 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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.012 c