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

Вниз

потоки   Найти похожие ветки 

 
sa2002   (2002-06-09 01:04) [0]

Помогите пожалуйста, вот хотел ускорить выполнение одного своего процеса и решил сделать это через модуль поток, Но тут возникла следующия проблема:
Я создал модуль поток, примерно такого содержания:

Unit uThread;
interface
uses
Classes,Sysutils,TakeStock_form,Data_module;//тут я подключаю свои
модули
type
DbThread = class(TThread)
private
{ Private declarations }
protected
procedure SelectDb;// проца для обращения к элементам формы
procedure Execute; override;
end;
var
TSelectData:DbThread;
implementation

procedure DbThread.Execute;
begin
Synchronize(SelectDb);// тут я вызываю её
end;

procedure DbThread.SelectDb;
begin
with frmTake_Stock do
begin
{ и тут у меня обращения к свойствам и др. ерунде в модуле (это
форма типи MDI)
НО КАК ТОЛЬКО ТЕКСТ ДОХОДИТ ДО ПЕРВОЙЖЕ СТРОЧКИ В ЭТОМ ТО ВЫДАЕТСЯ
ОШИБКА EAccessViolation } //вот про это я и хотел узнать почему?
end;
end.
Как я обращаюсь к потоку:
оп нажатию на кнопке:
var
var
TSD:DbThread;
......
TSD := DbThread.Create(true);
......
TSelectData.Resume;
....

Помогите пожалуйста !!!!


 
VID ©   (2002-06-09 01:31) [1]

фиг знает... может frmTake_Stock на момент обращения к ней ещё не существует, а может и какая-нибудь другая бяка...


 
MBo ©   (2002-06-09 06:43) [2]

TSD := DbThread.Create(true);
......
TSelectData.Resume;
создаешь одну переменную, а обращаешься к другой???


 
Polevi ©   (2002-06-09 09:12) [3]

так ты ничего не ускоришь - весь код работает в основном потоке


 
Anatoly Podgoretsky ©   (2002-06-09 09:31) [4]

Потоки(нити) то делаются не для ускорения, это не возможно при одном процессоре, а для паралельной работы, но с общим замедлением, время то на переключения и синхронизацию требуются.


 
Polevi ©   (2002-06-09 09:47) [5]

да, только пользователь не знает об этом


 
nick_sniper   (2002-06-12 23:09) [6]

Я так понимаю что ты хочешь в фоновом режиме считывать (записывать) данные, при этом пользовать может себе спокойно работать дальше ? Особенно это полезно при длительной записи - зачем пользователю ждать 20 мин до окончания процесса?

Я встречался с такой же проблемой. Ошибка вылетает из-за базы данных а не из-за нити (струны, thread). Суть в том, что БД при доступе из разных нитей требует сессии (соединения) созданного в этой же нити. Но если быть точным то это ещё зависит и от типа БД, так, например у Paradox и Acess - разные требования. Так что укажи, pls, формат который ты используешь.

В общем путь решения таков. В нити обьявляешь переменную типа TSession или TADOconnection для ADO. Обьявляешь переменные для таблиц. В конструкторе нити создаешь и инициализуруешь их. Таблицам указываешь сессии (или соединения) созданные в этой же нити. И всё работает прекрасно. В деструкторе освобождать их не обязательно - сам выгрузит. Но вот после "вечного" цикла в чем нибудь типа try..finally..end желательно закрывать таблицы.
Обязательно нужно корректно обрабатыевать все исключения try..except..end иначе нить просто может зависнуть.

Вывод: внутри нитей нельзя использовать компоненты БД брошенные на форму !!! Их нужно описывать внутри нити и инициализировать внутри нити !!! Understand ?

Если кому либо интересны проблемы подобного класса и вообще базы данных - буду рад переписываться с Вами


 
Кулюкин Олег ©   (2002-06-13 09:23) [7]

2 sa2002 (09.06.02 01:04)
Прислушайтесь к совету nick_sniper (12.06.02 23:09).
И не забудьте, если используется ADO, перед началом работы позвать CoInitialize(Null), а после CoUninitialize.
Все будет работать на ура.



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

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

Наверх




Память: 0.48 MB
Время: 0.016 c
14-77587
Malder
2002-05-20 17:21
2002.06.24
Насчет WWW.


1-77392
Jobber
2002-06-13 15:09
2002.06.24
Поп поводу CheckListBox


6-77517
Falk
2002-04-12 00:51
2002.06.24
динамическое создание сокета


1-77425
Dimitriev V G
2002-06-10 16:53
2002.06.24
Оптимизация программы на Дельфи, утилиты просмотра памяти, тактов


14-77612
Канадин Владимир
2002-05-22 15:26
2002.06.24
Обучаюший ролик