Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

потоки [D5, Win95/98, WinME]


sa2002 ©   (2002-06-09 01:04:00) 

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

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;
....

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


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

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


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

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

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

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

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

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


Polevi   (2002-06-09 09:47:00) [3]

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


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

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


Polevi   (2002-06-09 09:12:00) [5]

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


MBo   (2002-06-09 06:43:00) [6]

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


VID   (2002-06-09 01:31:00) [7]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо