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

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

Вызов процедуры основного модуля из потока [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]

пока ты не перестанешь "пихать", так и будешь иметь проблемы)

ну НЕТв программинге понятия "пихать" !!!


Наверх

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