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


 
Игорь Шевченко ©   (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.79 MB
Время: 0.011 c
15-1245213184
@!!ex
2009-06-17 08:33
2009.08.16
прикольная реклама gmail


1-1211881817
МистерТ
2008-05-27 13:50
2009.08.16
Расчет контрольной суммы


15-1245064618
Пит
2009-06-15 15:16
2009.08.16
Удлинитель ТВ-выхода?


15-1245181636
man from earth
2009-06-16 23:47
2009.08.16
а я например верю в лунатиков и в теории заговоров


1-1211793004
aidyn
2008-05-26 13:10
2009.08.16
20-значная цифра





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