Текущий архив: 2005.08.21;
Скачать: CL | DM;
Вниз
Вызов процедуры основного модуля из потока Найти похожие ветки
← →
DelphiN! © (2005-06-24 14:55) [0]Создал поток, в него запихал работу с Firebird-ом, и теперь при выполнении скажем MYMODULE.IbDataBase.Append; из дополнительного потока Приложение просто зависает, пытался под отладкой посмотреть, но отладчик просто не заходит в Append, и останавливается на этой строчке без каких либо сообщений. Когда процедура была в основном потоке все работало ...
Что за САБЖ ?
← →
Digitman © (2005-06-24 15:07) [1]пока ты не перестанешь "пихать", так и будешь иметь проблемы)
ну НЕТ в программинге понятия "пихать" !!!
← →
DelphiN! © (2005-06-24 15:17) [2]Ну есть у меня процедурка, которая основной поток не должна грузить, сначала написал ее в основном, потом перенес в дополнительный, что тут плохого ?
← →
Digitman © (2005-06-24 15:41) [3]
> что тут плохого ?
а что такое "пихать" ?
> Создал поток, в него запихал работу с Firebird-ом
не создал ты его.
ты просто описал класс (или что у тебя там - поточная ф-ция ?), "напихав" чего-то там куда-то)
создашь же ты его (поток) только в ран-тайм
← →
DelphiN! © (2005-06-24 15:50) [4]А я про рантайм и говорю
← →
DelphiN! © (2005-06-24 15:56) [5]Поток выполняется, это у меня оказывается отладчик глючит немного иногда, только почему зависает основной поток, как будто все действия выполняются в нем, ведь ожидания завершения у меня не стоит
Unit ThCreateRep;
type
TCreateRep = class(TThread)
..
procedure TCreateRep.CreateReport;
begin
...
end;
procedure TCreateRep.Execute;
begin
CreateReport;
end;
end.
Unit Main;
...
Uses ThCreateRep;
...
var
Th: ThCreateRep;
begin
Th := ThCreateRep.Create(false);
end.
← →
-=XP=- © (2005-06-24 15:59) [6]procedure TCreateRep.CreateReport;
begin
...
end;
Весьма информативно...MYMODULE.IbDataBase.Append
- что, прям так в потоке и вызываете?
← →
evvcom © (2005-06-24 16:00) [7]Да... всё очень понятно. Особенно момент работы с Append
← →
DelphiN! © (2005-06-24 16:01) [8]procedure TCreateRep.CreateReport;
begin
...
MYMODULE.IbDataBase.Append;
...
end;
← →
-=XP=- © (2005-06-24 16:05) [9]procedure TCreateRep.CreateReport;
begin
...
MYMODULE.IbDataBase.Append;
...
end;
Молодец. Возьмите с полки пирожок.
Заодно и книгу про работу с потоками.
И внимательно почитайте.
← →
DelphiN! © (2005-06-24 16:09) [10]А что тут как из другого модуля процедуру вызвать ?
← →
-=XP=- © (2005-06-24 16:19) [11]При обращении нескольких потоков к одним и тем же данным, если эти данные не являются потокобезовасными или потокозащищенными, возникает множество проблем. Каких - читайте в литературе.
В данном случае Вы напрямую обращаетесь к компоненту, размещенному в модуле, которые доступны и управляются из основного потока.
Для того, чтобы Вы поняли, что Вы сделали, напишите какой нибудь класс, изменяющий напрямую какую-то глобальную строковую переменную. А в основном потоке читайте значение этой переменной и выводите его на какой-то Label. Создайте несколько экземпляров этого потока - и наслаждайтесь...
Для решения Вашего вопроса существует множество решений - от создания приватной (доступной только для этого потока) классовой переменной (ну, у Вас там Database используется?), и работа с ней только из этого потока, и до использования различных методов синхронизации потоков - критические секции, мьютексы, семафоры и пр. В Вашей ситуации - лучше использовать еще один, внутрипотоковый, экземпляр Database.
← →
-=XP=- © (2005-06-24 16:27) [12]лучше использовать еще один, внутрипотоковый, экземпляр Database
Только ж не вздумайте "связывать" его с экземплярами из других потоков. А то, мало ли что у Вас там Database"ом зовется?
← →
NikNet © (2005-06-24 20:22) [13]Удалено модератором
← →
DelphiN! © (2005-06-25 12:02) [14]Все, полез читать, всем большое спасибо !
Страницы: 1 вся ветка
Текущий архив: 2005.08.21;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.024 c