Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.08.21;
Скачать: [xml.tar.bz2];

Вниз

Вызов процедуры основного модуля из потока   Найти похожие ветки 

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.08.21;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.04 c
4-1119592168
NikNet
2005-06-24 09:49
2005.08.21
Как старшее и младшое слово сделать DWORD? на DELPHI.


14-1122486666
Starcom
2005-07-27 21:51
2005.08.21
Почему в Windows 98/Me енто не работает?


14-1122541073
java73
2005-07-28 12:57
2005.08.21
У меня вопрос к админам


14-1122449894
sagsoft
2005-07-27 11:38
2005.08.21
Ваше представление о Казахстне


1-1122616813
Viktop
2005-07-29 10:00
2005.08.21
Вопрос по DevExpress





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский