Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.009 c
1-77340
Новеньки в Делфи
2002-06-12 20:22
2002.06.24
какой alt ctrl shift нажат, левый или правый?


7-77653
Alex_LG
2002-03-27 03:11
2002.06.24
Как для IE программно поставить/сменить прокси?


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


1-77389
Reticent
2002-06-13 15:27
2002.06.24
Мастера, подскажите , в чем ошибка


3-77311
MaximatorVeter
2002-05-31 11:21
2002.06.24
Как лучше подключить Oracle к Delphi?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский