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

Вниз

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

 
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;


 
Игорь Шевченко ©   (2009-06-15 00:08) [41]

Бп!


 
sniknik ©   (2009-06-15 00:09) [42]

а где построчные описания?

тебе не потоки, тебе азбуку программирования учить надо...
вот это что такое?
> var
> NewThread: TNewThread;

а судя по бедному описанию класса потока, "отправка" ссылается на компоненты брошенные на форму...


 
sniknik ©   (2009-06-15 00:13) [43]

> там ничего не понял.
оно и понятно, при таком базовом уровне

> Объясните на пальцах и поподробнее пожалуйста
высылай пальцы! попытаюсь...


 
Эстет   (2009-06-15 00:17) [44]

> dnepr   (15.06.09 00:00) [40]

Где коментарий КАЖДОЙ строки?


 
Эстет   (2009-06-15 00:21) [45]

Хотя бы этого участка
procedure TForm1.Button1Click(Sender: TObject);
var
NewThread: TNewThread;
begin
NewThread:=TNewThread.Create(true);
NewThread.FreeOnTerminate:=true;
NewThread.Priority:=tpLower;
NewThread.Resume;
end;

начиная с var. Т.е.
var // что это...
и т.д.


 
oldman ©   (2009-06-15 00:36) [46]

Блин, давно пора придумать компонент Thread.
Бросил на форму и делов...


 
Andy BitOff ©   (2009-06-15 09:00) [47]


> oldman ©   (15.06.09 00:36) [46]

Дык есть ужо. BmDelphiThread, например, юзал как-то еще под D5. Сейчас поп поиску посмотрел вроде обновление до D2005 есть.


 
Сергей М. ©   (2009-06-15 12:43) [48]


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


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


Чудовищные блины)

Ты будешь комментировать каждый свой блин или нет ?


 
Dennis I. Komarov ©   (2009-06-15 13:54) [49]


> Ты будешь комментировать каждый свой блин или нет ?

И как комментировать "Метод научного тыка"?


 
Palladin ©   (2009-06-15 14:18) [50]

Вчера около 11 часов вечера в лаборатории №17 методом научного тыка было получено удовольствие!


 
sniknik ©   (2009-06-15 14:28) [51]

а утром в 10.30 совершено открытие века! примерно через 5 минут открылось и второе веко...

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


 
dnepr   (2009-06-15 17:29) [52]

я не смотался. я здесь.
описание:
var
NewThread: TNewThread;
begin
//тут мы создали экземпляр класса TNewThread. Конструктор Create имеет //всего один параметр - CreateSuspended типа boolean, который указывает, //запустить новый поток сразу после создания (если false), или дождаться //команды (если true).
NewThread:=TNewThread.Create(true);

//свойство FreeOnTerminate определяет, что поток после выполнения //автоматически завершится, объект будет уничтожен, и нам не придётся его //уничтожать вручную. В нашем примере это не имеет значения, так как сам //по себе он никогда не завершится, но понадобится в следующих примерах.
NewThread.FreeOnTerminate:=true;

//устанавливает приоритет потока
NewThread.Priority:=tpLower;

//запуск потока.
NewThread.Resume;
end;

тут написано: http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1370


 
dnepr   (2009-06-15 17:30) [53]

слегка накосячил в посте


 
Сергей М. ©   (2009-06-15 17:35) [54]


> dnepr   (15.06.09 17:29) [52]


Каково, по-твоему, время жизни переменной NewThread ?


 
dnepr   (2009-06-15 17:42) [55]

Сергей М., время жизни зависит от времени выполнения потока наверное


 
Dennis I. Komarov ©   (2009-06-15 17:43) [56]


> наверное

ты программист или где?


 
Сергей М. ©   (2009-06-15 17:46) [57]


> dnepr   (15.06.09 17:42) [55]


Если переменная статическая, то с некоторой долей условности можно сказать, что да. Иначе - нет.

А у тебя о каком потоке идет речь в [52] ?
И каково время его жизни ?
И какая переменная - статическая или локальная ?


 
dnepr   (2009-06-15 17:54) [58]

я думаю что переменная статическая.
а время жизни потока зависит от этой строчки:
NewThread.FreeOnTerminate:=true;


 
Эстет   (2009-06-15 17:56) [59]

> dnepr   (15.06.09 17:29) [52]

Я же не просто так спросил у тебя что такое var. Что такое var в твоём коде? Ты так и не написал.


 
dnepr   (2009-06-15 17:57) [60]

var - объявление переменной


 
Dennis I. Komarov ©   (2009-06-15 17:58) [61]


> dnepr   (15.06.09 17:54) [58]

Компьютер, уберите два не верных ответа...


 
Эстет   (2009-06-15 17:58) [62]

> dnepr   (15.06.09 17:57) [60]
> var - объявление переменной

Блин. Какой? Ну что из тебя по слову все вытаскивать.


 
Сергей М. ©   (2009-06-15 17:58) [63]


> думаю что переменная статическая


На основании чего ты так думаешь ?


> время жизни потока зависит от этой строчки:
> NewThread.FreeOnTerminate:=true;


Абсолютно не зависит.

Переменная NewThread рождается, живет и умирает совсем в другом потоке - в основном.


 
Dennis I. Komarov ©   (2009-06-15 18:01) [64]


> живет и умирает

и очень быстро...


 
dnepr   (2009-06-15 18:03) [65]


> На основании чего ты так думаешь ?

потому что динамическая бы изменялась во время выполнения а эта нет


> Блин. Какой? Ну что из тебя по слову все вытаскивать.

NewThread


 
clickmaker ©   (2009-06-15 18:03) [66]

> как при закрытии окна программы сделать ожидание завершения
> потока , а затем выход

то закрывать окно, но не убивая поток...
то, не закрывая окна, ждать поток...
что все-таки нужно?


 
Эстет   (2009-06-15 18:04) [67]

больно слышать © Игорь Шевченко


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


> а эта нет
>


На основании чего ты утверждаешь, что она не изменяется ?


> во время выполнения


Во время выполнения чего ?


 
dnepr   (2009-06-15 18:06) [69]


> то закрывать окно, но не убивая поток...
> то, не закрывая окна, ждать поток...

мне нужно закрыть окно, но не убивая поток.


 
dnepr   (2009-06-15 18:07) [70]


> Во время выполнения чего ?

во время выполнения потока.


> На основании чего ты утверждаешь, что она не изменяется
> ?

дак она изменяется?


 
Юрий Зотов ©   (2009-06-15 18:07) [71]

> dnepr

Переменная NewThread объявлена в методе Button1Click - с чего же она будет известна в методе FormClose? Это ведь уже другой метод.

Даже если в методе FormClose объявить переменную с тем же именем (как у Вас), то это будет уже другая переменная, ничего общего с первой не имеющая.

Значит, эту переменную надо объявить не в методе Button1Click, а в другом месте - так, чтобы она была доступна в обоих методах. Подумайте, как это сделать. Подсказка - оба метода принадлежат одной и той же форме и находятся в одном и том же модуле.

Потом подумайте - зачем Вы автоматически уничтожаете поток (FreeOnTerminate) сразу после его завершения? А если он завершится до того, как будет закрыта форма - ведь тогда переменная NewThread будет указывать на уже несуществующий объект и при обращении к ней в методе FormClose возникнет ошибка.

Далее подумайте, зачем Вам нужен приоритет tpLower? Не нужно слепо копировать примеры.

Ну и наконец, подумайте - как может завершиться Ваша программа, если Вы не даете закрыться ее главной форме (CanClose)? Что надо написать в методе FomClose, чтобы форма:
- дождалась завершения потока;
- уничтожила его;
- закрылась.


 
Dennis I. Komarov ©   (2009-06-15 18:08) [72]

А не развод ли?


 
Сергей М. ©   (2009-06-15 18:10) [73]


> блин.. сделал так
>
> procedure TForm1.Button1Click(Sender: TObject);
> var
> NewThread: TNewThread; //это ЛОКАЛЬНАЯ переменная, время ее жизни равно времени выполнения обработчика клика кнопки, выполняемого в ОСНОВНОМ потоке процесса приложения



> а еще сделал вот так:
>
> procedure TForm1.Button1Click(Sender: TObject);
> var
> NewThread: TNewThread;//И это тоже это ЛОКАЛЬНАЯ переменная, время ее жизни равно времени выполнения обработчика клика кнопки, выполняемого в ОСНОВНОМ потоке процесса приложения



> procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose:
>  Boolean);
> var
> NewThread: TNewThread; //И это тоже это ЛОКАЛЬНАЯ переменная, время ее жизни равно времени выполнения обработчика клика кнопки, выполняемого в ОСНОВНОМ потоке процесса приложения
> begin
> If NewThread.Suspended Then NewThread.Resume; //ЧЕМУ, по-твоему, равно значение этой переменной, если она ТОЛЬКО ЧТО начала жить в ОСНОВНОМ потоке и ты в нее ничего не записал ?


 
Игорь Шевченко ©   (2009-06-15 18:10) [74]

одним спамером станет меньше


 
Юрий Зотов ©   (2009-06-15 18:22) [75]

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

type
 TForm1 = class(TForm)
   procedure Button1Click(Sender: TObject);
   procedure FormClose(Sender: TObject; var CanClose: boolean);
 private
   NewThread: TNewThread;
   procedure ThreadTerminated(Sender: TObject);
 end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 if NewThread = nil then
 begin
   NewThread := TNewThread.Create(True)
   NewThread.OnTerminate := ThreadTerminated;
   NewThread.Resume;
   Button1.Enabled := False
 end
end;

procedure TForm1.FormClose(Sender: TObject; var CanClose: boolean);
begin
 if NewThread <> nil then
   NewThread.WaitFor
end;

procedure TForm1.ThreadTerminated(Sender: TObject);
begin
 FreeAndNil(NewThread);
 Button1.Enabled := True
end;


 
Сергей М. ©   (2009-06-15 18:24) [76]


> dnepr   (15.06.09 18:07) [70]
> во время выполнения потока


Какого потока-то ?
Их у тебя 2) ..


> дак она изменяется?


Если ты сам ее не изменишь, то не изменяется.
Но содержимое локальной переменной в момент рождения не определено и ты его тоже не определил.


 
MonoLife ©   (2009-06-15 18:35) [77]


> clickmaker ©   (15.06.09 18:03) [66]


> что все-таки нужно?
>

сервер ему нужен..


 
dnepr   (2009-06-15 18:35) [78]

Юрий Зотов, спасибо за исчерпывающий ответ! я бы вам руку пожал, да не смогу это сделать к сожалению


> > If NewThread.Suspended Then NewThread.Resume; //ЧЕМУ,
> по-твоему, равно значение этой переменной, если она ТОЛЬКО
> ЧТО начала жить в ОСНОВНОМ потоке и ты в нее ничего не записал
> ?

оно ничему не будет равно


 
Сергей М. ©   (2009-06-15 18:42) [79]


> оно ничему не будет равно


Будет. Переменная не может не иметь никакого значения.
Но значение это совсем не то которое ты ожидаешь.


 
Сергей М. ©   (2009-06-15 18:44) [80]


> dnepr   (15.06.09 18:35) [78]


Так ведь в [75], так же как и в Demos\Threads, нет комментариев)



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

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

Наверх





Память: 0.61 MB
Время: 0.012 c
2-1245399017
Б
2009-06-19 12:10
2009.08.16
Скорость алгоритма.


2-1245146560
Polkin
2009-06-16 14:02
2009.08.16
Assigned к объекту своего класса...


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


2-1245318231
Vitaliy_____
2009-06-18 13:43
2009.08.16
Правильное оформление деструктора


15-1245203187
brother
2009-06-17 05:46
2009.08.16
Защита от AUTORUN.INF вирусов.





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