![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вызов процедуры основного модуля из потока [D6, Win2k]
DelphiN! © (2005-06-24 14:55:00)Создал поток, в него запихал работу с Firebird-ом, и теперь при выполнении скажем MYMODULE.IbDataBase.Append; из дополнительного потока Приложение просто зависает, пытался под отладкой посмотреть, но отладчик просто не заходит в Append, и останавливается на этой строчке без каких либо сообщений. Когда процедура была в основном потоке все работало ...
Что за САБЖ ?
DelphiN! (2005-06-25 12:02:00) [1]Все, полез читать, всем большое спасибо !
NikNet (2005-06-24 20:22:00) [2]Удалено модератором
-=XP=- (2005-06-24 16:27:00) [3]лучше использовать еще один, внутрипотоковый, экземпляр Database
Только ж не вздумайте "связывать" его с экземплярами из других потоков. А то, мало ли что у Вас там Database'ом зовется?
-=XP=- (2005-06-24 16:19:00) [4]При обращении нескольких потоков к одним и тем же данным, если эти данные не являются потокобезовасными или потокозащищенными, возникает множество проблем. Каких - читайте в литературе.
В данном случае Вы напрямую обращаетесь к компоненту, размещенному в модуле, которые доступны и управляются из основного потока.
Для того, чтобы Вы поняли, что Вы сделали, напишите какой нибудь класс, изменяющий напрямую какую-то глобальную строковую переменную. А в основном потоке читайте значение этой переменной и выводите его на какой-то Label. Создайте несколько экземпляров этого потока - и наслаждайтесь...
Для решения Вашего вопроса существует множество решений - от создания приватной (доступной только для этого потока) классовой переменной (ну, у Вас там Database используется?), и работа с ней только из этого потока, и до использования различных методов синхронизации потоков - критические секции, мьютексы, семафоры и пр. В Вашей ситуации - лучше использовать еще один, внутрипотоковый, экземпляр Database.
DelphiN! (2005-06-24 16:09:00) [5]А что тут как из другого модуля процедуру вызвать ?
-=XP=- (2005-06-24 16:05:00) [6]procedure TCreateRep.CreateReport;
begin
...
MYMODULE.IbDataBase.Append;
...
end;
Молодец. Возьмите с полки пирожок.
Заодно и книгу про работу с потоками.
И внимательно почитайте.
DelphiN! (2005-06-24 16:01:00) [7]procedure TCreateRep.CreateReport;
begin
...
MYMODULE.IbDataBase.Append;
...
end;
evvcom (2005-06-24 16:00:00) [8]Да... всё очень понятно. Особенно момент работы с Append
-=XP=- (2005-06-24 15:59:00) [9]procedure TCreateRep.CreateReport;
begin
...
end;
Весьма информативно...
MYMODULE.IbDataBase.Append- что, прям так в потоке и вызываете?
DelphiN! (2005-06-24 15:56:00) [10]Поток выполняется, это у меня оказывается отладчик глючит немного иногда, только почему зависает основной поток, как будто все действия выполняются в нем, ведь ожидания завершения у меня не стоит
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.
DelphiN! (2005-06-24 15:50:00) [11]А я про рантайм и говорю
Digitman (2005-06-24 15:41:00) [12]
> что тут плохого ?
а что такое "пихать" ?
> Создал поток, в него запихал работу с Firebird-ом
не создал ты его.
ты просто описал класс (или что у тебя там - поточная ф-ция ?), "напихав" чего-то там куда-то)
создашьже ты его (поток) только в ран-тайм
DelphiN! (2005-06-24 15:17:00) [13]Ну есть у меня процедурка, которая основной поток не должна грузить, сначала написал ее в основном, потом перенес в дополнительный, что тут плохого ?
Digitman (2005-06-24 15:07:00) [14]пока ты не перестанешь "пихать", так и будешь иметь проблемы)
ну НЕТв программинге понятия "пихать" !!!