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