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

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.64 MB
Время: 0.022 c
15-1245124402
Демон
2009-06-16 07:53
2009.08.16
Copy: Командная строка


2-1245231551
вопрос
2009-06-17 13:39
2009.08.16
увеличение дин.массива


2-1245155502
kirat
2009-06-16 16:31
2009.08.16
как в TreeView поместить CheckBox


15-1245452036
Иксик
2009-06-20 02:53
2009.08.16
I will derive


3-1225884587
Tepex
2008-11-05 14:29
2009.08.16
приложение зависает при обращении к Firebird. что делать помогите