Форум: "Основная";
Текущий архив: 2002.06.24;
Скачать: [xml.tar.bz2];
Внизпотоки Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.008 c