Форум: "Прочее";
Текущий архив: 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