Главная страница
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;


 
Игорь Шевченко ©   (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, нет комментариев)


 
dnepr   (2009-06-15 19:01) [81]

nil!


 
dnepr   (2009-06-15 19:02) [82]

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


 
Сергей М. ©   (2009-06-15 19:07) [83]


> nil!


Чего "nil" ?)


 
dnepr   (2009-06-15 19:27) [84]

Юрий, я сделал как вы сказали, но форма зависает когда нажимаешь на кнопку закрытия формы. И потом даже когда письмо доходит - форма недоступна. я сделал так:
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if NewThread <> nil then
  NewThread.WaitFor;
  Form1.Visible:=False;
end;

но все равно также...


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

Сергей, наверное nil?


 
Сергей М. ©   (2009-06-15 19:32) [85]


> dnepr   (15.06.09 19:27) [84]


> наверное nil?


"Не определено" означает любое, т.е. заранее неизвестное значение, в т.ч. и nil.

Локальные переменные подпрограмм в Делфи рождаются, живут и умирают в стеке, если страшное слово "стек" тебе о чем-то говорит.


 
Сергей М. ©   (2009-06-15 19:36) [86]


> даже когда письмо доходит - форма недоступна


Сейчас мы еще двести-триста постов будем клянчить у тебя код метода Execute.

Впрочем зачем ?

Ты же заявил


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


 
dnepr   (2009-06-15 19:36) [87]

говорит. я читал об этом


 
Сергей М. ©   (2009-06-15 19:41) [88]


> говорит. я читал об этом


И ?

Откуда же тогда взялся NIL ? Если "говорит" и "читал" ?


 
dnepr   (2009-06-15 19:44) [89]


> Откуда же тогда взялся NIL ? Если "говорит" и "читал" ?


я не могу ответить на этот вопрос...


 
Сергей М. ©   (2009-06-15 19:45) [90]


> не могу ответить на этот вопрос


Почему ?


 
dnepr   (2009-06-15 19:51) [91]

потому что не знаю ответа


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

Т.е. от балды ляпнул ?


 
dnepr   (2009-06-15 19:54) [93]

я оперся на это:
if NewThread <> nil then


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


> я оперся на это


Почему ?

В [75] нет переменных - ни локальных, ни статических.

А я веду с тобой беседу опираясь на твой код, фигурировавший у тебя до [75]

Прежде чем ортогонально разворачивать оглобли предупреждать вообще-то надо)


 
dnepr   (2009-06-15 20:10) [95]

хорошо, извини. Если опираться на код до [75], то я спрошу


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

чему будет равна переменная NewThread тут ?
If NewThread.Suspended Then NewThread.Resume;


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


> dnepr   (15.06.09 20:10) [95]


Чему угодно. Значение локальной переменной НЕ определено.


 
dnepr   (2009-06-15 20:21) [97]

Сергей помоги разобраться с этим:
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;
end
end;

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


procedure TForm1.ThreadTerminated(Sender: TObject);
begin
FreeAndNil(NewThread);
end;


Я прячу форму когда ее закрывают но программа выполняется и поток тоже. Как сделать так, чтобы форма пряталась, а программа не висела в памяти после выполнения потока (NewThread.WaitFor;)?


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


> dnepr   (15.06.09 20:10) [95]


Уточню - не определено если это переменная generic типа.
Упомянутый тобой тип относится к generic-типам данных.


 
Сергей М. ©   (2009-06-15 20:27) [99]


> Form1.Hide;


Это что за отсебячина ?

Зачем эта строчка ?


 
dnepr   (2009-06-15 20:28) [100]

я же хочу спрятать форму во время выполнения потока, вот я и спрятал...


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


> хочу спрятать форму


А причем здесь тогда "программа не висела в памяти после выполнения потока" ? Какое отношение видимость формы имеет к "висению" чего-то там в памяти ?


 
dnepr   (2009-06-15 20:37) [102]

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


 
oldman ©   (2009-06-15 20:43) [103]


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


Круто.
;)


 
sniknik ©   (2009-06-15 20:44) [104]

программа не делает того, что ты хочешь, она делает то что ты пишешь...


 
dnepr   (2009-06-15 20:45) [105]

sniknik, и что мне дописать?


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


> а я на время выполнения этого спрячу форму


А нашиша ее прятать явно, если событие OnClose как раз и говорит о том, что форма сейчас "спрячется" ?


 
sniknik ©   (2009-06-15 20:50) [107]

> sniknik, и что мне дописать?
допиши к программе заявление об уходе, распечатай, убедись, что  оно с новой страницы, и неси последний лист в отдел кадров.
пусть вместо тебя возьмут программиста.


 
dnepr   (2009-06-15 20:51) [108]


> А нашиша ее прятать явно, если событие OnClose как раз и
> говорит о том, что форма сейчас "спрячется" ?

а как иначе?


 
Сергей М. ©   (2009-06-15 20:52) [109]

program MyDummyProgram;
..
uses ... MyNewThreadUnit ...;

begin
...
 Application.Run;
 if NewThread <> nil then
   NewThread.WaitFor;
end.


 
sniknik ©   (2009-06-15 20:55) [110]

Сергей М. ©   (15.06.09 20:52) [109]
ой зря... он так и не показал код execute-а, не опроверг предположение, что используются компоненты с формы...


 
dnepr   (2009-06-15 20:55) [111]

теперь она не закрывается....


 
dnepr   (2009-06-15 20:56) [112]

в execute не используются компоненты формы


 
dnepr   (2009-06-15 20:58) [113]

а еще по завершению потока NewThread форма опять зависает


 
Игорь Шевченко ©   (2009-06-15 20:59) [114]


> теперь она не закрывается....


захватывающе!


 
Сергей М. ©   (2009-06-15 20:59) [115]


> теперь она не закрывается


Что значит "теперь" ?)


 
Сергей М. ©   (2009-06-15 21:01) [116]


> в execute не используются компоненты формы


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


 
sniknik ©   (2009-06-15 21:02) [117]

и кто она? если соседка в душе то прикольно, сестра пошло.


 
MsGuns ©   (2009-06-15 21:02) [118]

Цирк на дроте


 
dnepr   (2009-06-15 21:02) [119]

да вы правы


 
dnepr   (2009-06-15 21:06) [120]

все... тема перемещена..... мне никто не поможет ..


 
Сергей М. ©   (2009-06-15 21:07) [121]

Сам виноват.


 
sniknik ©   (2009-06-15 21:08) [122]

> все... тема перемещена..... мне никто не поможет ..
шансов и так не было. т.к. тебе не помогать надо, а все полностью за тебя делать. дураков мало.


 
MsGuns ©   (2009-06-15 21:10) [123]

Понимание потоков, действительно, не так тривиально, как может показаться тем, кто с ними "живет". ИМХО, не стоит стебаться с новичка - ему дали нормальные ссылки - путиь сам осваивает.


 
sniknik ©   (2009-06-15 21:10) [124]

> дураков мало.
в смысле мало кто на таких условиях "помогать" будет.
а то сочтут еще, что это оскорбление. т.е. про тебя (таких то как раз много).


 
Сергей М. ©   (2009-06-15 21:11) [125]

Помогите хоть мылом человеку)


 
dnepr   (2009-06-15 21:11) [126]

а для чего тогда этот форум, если все здесь издеваются и не помогают? исключение - единицы...


 
dnepr   (2009-06-15 21:12) [127]

я про новичков


 
sniknik ©   (2009-06-15 21:13) [128]

> путиь сам осваивает.
если бы он хоть что то сам освоил бы... все было бы по другому. но ему не потоки нужно осваивать, а азы, что такое переменные, синтаксис if (и других что не показал, т.к. боится ляпы показывать), что такое и зачем операторные скобки и т.д. прочитать книжку типа "букварь дельфи для чайников".


 
sniknik ©   (2009-06-15 21:17) [129]

> а для чего тогда этот форум
для программистов.

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


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


> для чего тогда этот форум, если все здесь издеваются и не
> помогают?


Тебе, мил человек, уже столохматый раз "намекают" - покажи что у тебя творится в Execute, от этого вполне может зависеть и решение)

К [128]-му посту ты так и не понял "намека".
Т.е. следует вывод, что ты безнадежно тупой ?)


 
Игорь Шевченко ©   (2009-06-15 21:19) [131]


> а для чего тогда этот форум, если все здесь издеваются и
> не помогают?


Не всем можно помочь...


 
dnepr   (2009-06-15 21:20) [132]

я понял намек. Буду разбираться сам.


 
Эстет   (2009-06-15 21:22) [133]

Надо же стойкий какой и упрямый. Спорю что телец.


 
Сергей М. ©   (2009-06-15 21:23) [134]


> Спорю что телец


Грешно смеяться над тормозами


 
Юрий Зотов ©   (2009-06-15 23:46) [135]

Мужики, извините, но вы неправы.



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

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

Наверх




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


2-1245284214
<AIRDIGER>
2009-06-18 04:16
2009.08.16
web сторку к норамальному пути


2-1245389217
smolkown
2009-06-19 09:26
2009.08.16
Мониторинг печати


2-1245582008
Б
2009-06-21 15:00
2009.08.16
Найти доступ владения окном.


2-1245605116
Женя
2009-06-21 21:25
2009.08.16
Програмка для определения типа инсталлятора программ.