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

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.008 c
1-1211988241
lazanor
2008-05-28 19:24
2009.08.16
подключение Mathcad или Mathematica к Delphi


15-1245344854
Alf
2009-06-18 21:07
2009.08.16
Проблемы с сеткой. Видно только свой сегмент


15-1245048199
Индеец
2009-06-15 10:43
2009.08.16
Delphi 2009 Configuration Manager и директивы компилятора


2-1245432738
Footballer
2009-06-19 21:32
2009.08.16
Изменить свойства чужого окна (AutoSctoll или ScrollBars)


15-1245079850
Cyrax
2009-06-15 19:30
2009.08.16
В каких случаях...





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