Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.08.16;
Скачать: CL | DM;

Вниз

Вопрос про потоки   Найти похожие ветки 

 
dnepr   (2009-06-12 18:23) [0]

Привет народ!
Есть некоторая функция. Как сделать так чтобы она выполнялась в фоновом режиме (то есть в потоке), а сама прога работала бы независимо от этого потока? Прошу пример пожалуйста


 
MBo ©   (2009-06-12 18:38) [1]

см. Demos/Threads


 
dnepr   (2009-06-12 18:50) [2]

там ничего не понял. Объясните на пальцах и поподробнее пожалуйста


 
easy ©   (2009-06-12 18:59) [3]


> там ничего не понял

вот поймете, и приходите тогда..


 
oldman ©   (2009-06-12 19:12) [4]


> dnepr   (12.06.09 18:23)  
> Прошу пример пожалуйста


Прошу озвучить сумму, за которую мы будем делать за вас ваш курсач.


 
dnepr   (2009-06-12 21:13) [5]

это не курсач, а проблема с программой. Я хочу вынести функцию в поток, а в исходнике вообще даже комментариев нет...


 
turbouser ©   (2009-06-12 21:27) [6]


> dnepr   (12.06.09 21:13) [5]

Тебе уже подсказали. Или рассказывай что не понятно, или гугл в помощь.


 
Сергей М. ©   (2009-06-12 21:36) [7]


> в исходнике вообще даже комментариев нет


А что говорит справка к классу TThread в целом и его методу Execute в частности и в 1-ю очередь, ты уже поинтересовался ? Проштудировал ? И нишиша не понял там ?)


 
Игорь Шевченко ©   (2009-06-12 22:09) [8]


> а в исходнике вообще даже комментариев нет...


больно слышать


 
Amoeba ©   (2009-06-13 00:20) [9]

Автору вопроса читать:
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1370


 
Германн ©   (2009-06-13 00:51) [10]


> Игорь Шевченко ©   (12.06.09 22:09) [8]
>
>
> > а в исходнике вообще даже комментариев нет...
>
>
> больно слышать
>

Некоторые считают, что комментарии нужны, главным образом, для того, чтобы объяснять каждую строку кода "на пальцах" для  "стрекоз".


 
dnepr   (2009-06-13 21:40) [11]

Amoeba, спасибо тебе большое


 
dnepr   (2009-06-13 21:42) [12]

Теперь у меня последний вопрос: если запустить поток и быстро выйти из программы, то он оборвется и не завершится. Как сделать так чтобы он продолжал работу при закрытии окна программы?


 
oldman ©   (2009-06-13 22:47) [13]


> dnepr   (13.06.09 21:42) [12]


При закрытии окна не выходить из программы.
Выходить по окончании работы потока.


 
dnepr   (2009-06-13 22:49) [14]


> Выходить по окончании работы потока.

можно пример реализации этого пожалуйста?


 
Германн ©   (2009-06-14 01:00) [15]


> dnepr   (13.06.09 22:49) [14]
>
>
> > Выходить по окончании работы потока.
>
> можно пример реализации этого пожалуйста?
>

С комментариями или без?


 
Германн ©   (2009-06-14 01:20) [16]

Вдобавок. По поводу "реализации этого" есть встречный вопрос. Чего этого?
1. По "закрытию окна" не завершать сразу программу?
2. "Выходить по окончании работы потока."?


 
dnepr   (2009-06-14 10:41) [17]

Германн, можно и без )
меня интуресует выходить только по окончанию работы потока, а при закрытии программы только прятать форму. Спрятать форму при закрытии я могу, а вот как дождаться завершения поткоа и окончательно выйти я не знаю. Help please


 
Сергей М. ©   (2009-06-14 12:04) [18]


> как дождаться завершения поткоа


Поток.WaitFor


 
dnepr   (2009-06-14 12:32) [19]


> Поток.WaitFor

куда это писать? в procedure TMyThread.Execute; или так?

var
 MyThread: TMyThread;
begin
 MyThread:=TMyThread.Create(true);
 MyThread.FreeOnTerminate:=true;
 MyThread.Priority:=tpLower;
 MyThreadd.Resume;
MyThread.WaitFor;
end;


 
Сергей М. ©   (2009-06-14 12:41) [20]


> в procedure TMyThread.Execute


Как ты себе это представляешь, поток ждет завершения самого себя ?


> или так?


Метод WaitFor предназначен для вызова в любом другом потоке, который нуждается в ожидании завершения данного потока.


> MyThread.FreeOnTerminate:=true;


Тем самым ты указываешь объекту-потоку, что по окончании работы он должен самостоятельно себя уничтожить.


> MyThread.WaitFor;


И если на момент вызова этого метода в другом потоке он себя уничтожил, то вызов метода приведет к исключению.

Выводы делай сам.


 
dnepr   (2009-06-14 12:46) [21]

как все сложно....


 
dnepr   (2009-06-14 12:53) [22]

а чем отличается WaitForSingleObject от WaitFor ?


 
Сергей М. ©   (2009-06-14 13:01) [23]


> как все сложно


Что сложно ?


> чем отличается WaitForSingleObject от WaitFor


WaitForSingleObject - это WinAPI-функция ожидания сигнала любого допустимого объекта синхронизации.

WaitFor - это метод дельфийского объекта, в котором при помощи WinAPI-функции происходит ожидание сигнала конкретного объекта синхронизации, а именно сигнала завершения поточной функции потока, с которым ассоциирован этот объект.


 
Anatoly Podgoretsky ©   (2009-06-14 13:02) [24]

> dnepr  (14.06.2009 12:53:22)  [22]

Одно метод, а другое функция ожидания перехода одиночноно объекта синхронизации в сигнальное состояние или по таймауту.


 
dnepr   (2009-06-14 13:08) [25]

а я не использую синхронизацию в своем потоке и что теперь мне эти Wait"ы не подойдут?


 
dnepr   (2009-06-14 13:11) [26]


> Что сложно ?


сложные эти потоки. Мне не понятно до сих пор как при закрытии окна программы сделать ожидание завершения потока , а затем выход. Если я сделаю так, это будет правильно?

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
MyThread.WaitFor;
   CanClose := False;
end;


 
dnepr   (2009-06-14 13:17) [27]

так не работает. ругается на MyThread


 
Riply ©   (2009-06-14 13:21) [28]

> так не работает. ругается на MyThread

"Я не имею слов" (с) "Остров Погибших Кораблей"  :)


 
Игорь Шевченко ©   (2009-06-14 15:05) [29]


> так не работает. ругается на MyThread


больно слышать


 
Сергей М. ©   (2009-06-14 15:05) [30]


> а я не использую синхронизацию в своем потоке


В каком "своем" ?

У тебя их два - основной, тот который твою форму открывает-закрывает-рисует, и дополнительный.

Основной, закрыв форму, прежде чем вызвать ExitProcess (именно эта ф-ция завершает работу приложения) должен, как ты говоришь, перед этим дождаться момента, когда завершится доп.поток, т.е. выполнить синхронные с доп.потоком действия.

Ты будешь продолжать утверждать, что не используешь синхронизацию ?)


> ругается на MyThread


Матерно ?)


 
dnepr   (2009-06-14 15:45) [31]

ах вот оно как на самом то деле =)
тогда у меня вопрос. Куда добавлять MyThread.WaitFor; ?


 
Сергей М. ©   (2009-06-14 16:02) [32]


> Куда добавлять MyThread.WaitFor; ?


Туда где требуется это самое ожидание, куда же еще ?)


 
dnepr   (2009-06-14 16:27) [33]

я добавил сюда (это происходит по нажатию кнопки)

var
 NewThread: TNewThread;
begin
 NewThread:=TNewThread.Create(true);
 NewThread.FreeOnTerminate:=true;
 NewThread.Priority:=tpLower;
 NewThread.Resume;
 NewThread.WaitFor;

потом появилась ошибка при нажатии кнопки - ThreadError: Неверный дескриптор (6). Почему?


 
Сергей М. ©   (2009-06-14 16:34) [34]


> ThreadError: Неверный дескриптор (6). Почему?


Ты  [20]-то вообще читал ?


 
Плохиш ©   (2009-06-14 18:38) [35]


> Сергей М. ©   (14.06.09 16:34) [34]
>
>
> > ThreadError: Неверный дескриптор (6). Почему?
>
>
> Ты  [20]-то вообще читал ?

Он там ничего не понял ;-)

PS. Они до сих пор считают, что каждый сантехник может быть программистом...


 
dnepr   (2009-06-14 23:17) [36]

пожалуйста дайте пример реализации правильного ожидания завершения второго (дополнительного) потока в программе


 
dnepr   (2009-06-14 23:36) [37]

блин.. сделал так

procedure TForm1.Button1Click(Sender: TObject);
var
NewThread: TNewThread;
begin
NewThread:=TNewThread.Create(true);
NewThread.FreeOnTerminate:=false;
NewThread.Priority:=tpLower;
NewThread.Resume;
if not NewThread.Suspended then
NewThread.WaitFor;
//else NewThread.Free;
inherited;
end;


и теперь форма зависает, как будто бы и нету этого потока.....


 
dnepr   (2009-06-14 23:51) [38]

а еще сделал вот так:

procedure TForm1.Button1Click(Sender: TObject);
var
NewThread: TNewThread;
begin
NewThread:=TNewThread.Create(true);
NewThread.FreeOnTerminate:=true;
NewThread.Priority:=tpLower;
NewThread.Resume;
If NewThread.Suspended Then NewThread.Resume;
NewThread.Terminate;
//else NewThread.Free;
end;


но письмо не доходит когда форму закрываешь...


 
Эстет   (2009-06-14 23:53) [39]

> dnepr   (14.06.09 23:36) [37]

Блин, да что же ты сам-то головой подумать не хочешь?
Давай по порядку. Опиши что делает каждая строчка твоего кода. Каждая!


 
dnepr   (2009-06-15 00:00) [40]

TNewThread = class(TThread)
   private
 protected
   procedure Execute; override;
 end;

procedure TNewThread.Execute;
begin
{отправка письма с аттачем через idsmtp}
end;

//запускаю поток

procedure TForm1.Button1Click(Sender: TObject);
var
 NewThread: TNewThread;
begin
 NewThread:=TNewThread.Create(true);
 NewThread.FreeOnTerminate:=true;
 NewThread.Priority:=tpLower;
 NewThread.Resume;
end;

// пытаюсь не прерывать поток при закрытии формы...

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
var
NewThread: TNewThread;
begin
If NewThread.Suspended Then NewThread.Resume;
NewThread.Terminate;
//else NewThread.Free;
end;



Страницы: 1 2 3 4 вся ветка

Текущий архив: 2009.08.16;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.017 c
11-1205403546
DJ_UZer
2008-03-13 13:19
2009.08.16
Перевод из инт в стр


15-1245308606
тимохов
2009-06-18 11:03
2009.08.16
Ограничения VS 2088 Express и MSSQL Server 2008 Express


15-1245049036
DelphiN!
2009-06-15 10:57
2009.08.16
Не могу завершить процес пользователя под админской учеткой


1-1211958221
Still Swamp
2008-05-28 11:03
2009.08.16
Dsgjkyb


15-1244884195
Kerk
2009-06-13 13:09
2009.08.16
Как переводится chode?