-
Программистов прошу не подсказывать!!!Есть такая процедура:
procedure Proc(var Flag: boolean);
begin
ShowMessage('Процедура Proc стартовала');
while Flag do
begin
Sleep(1);
Application.ProcessMessages;
end;
ShowMessage('Процедура Proc завершилась');
end;
Задание: одной кнопкой вызвать процедуру Proc с параметром True, другой кнопкой завершить ее. Менять код процедуры нельзя.
-
Первые пять секунд после прочтения сообщения я с нарастающией скоростью падал в своих глазах...
потом дошло. :))
-
> другой кнопкой завершить ее.
Power?
-
procedure Start()
var
T:boolean;
begin
T:=true;
Proc(T);
end;
procedure Stop();
begin
Application.Terminate();
end;
Хотя это не то, что имелось ввиду, но условию задачи не противоречит. :)
-
и прервется? :)
-
halt
-
Если бросить исключение в Sleep или Application.ProcessMessages это считается «выходом»? :)
-
var T:boolean;
procedure TForm1.Button1Click(Sender: TObject);
begin
T:=true;
if(sender as TButton).Tag=2 then begin
t:=false;
end else
Proc(T);
end;
расставить tag по вкусу, назначить один обработчик :)
это есть не нравится вылет приложения :)
-
Вместо sleep(1) нужно поставить SwitchToThread. Так корректнее.
-
Иначе дофигища ресурсов тратится. На каждый слип уходит примерно под 1000 тактов..
-
var
Form1: TForm1;
FFlag:boolean;
implementation
procedure Proc(var Flag: boolean);
begin
ShowMessage('Процедура Proc стартовала');
while Flag do
begin
Sleep(1);
Application.ProcessMessages;
end;
ShowMessage('Процедура Proc завершилась');
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
FFlag:=True;
Proc(FFlag);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
FFlag:=False;
end;
-
просили же не подсказывать, едрен батон..
а тут код вывалили
шоб в начинающих так отвечали..
-
я предлагаю усложнить задачу.
До
procedure Proc;
begin
ShowMessage('Процедура Proc стартовала');
while True do
begin
Sleep(1); // Это чтобы не грузить процессор
Application.ProcessMessages;
end;
ShowMessage('Процедура Proc завершилась');
end;
на одной кнопке запуск
на второй корретный выход.
P.S. Идеи кое какие на этот счет имеются, но до конца пока не довел.
-
> turbouser © (03.09.08 23:15) [10]
Кстати твое решение правильнее написать так.
procedure TForm1.Button2Click(Sender: TObject);
begin
InterlockedExchange(@FFlag,0);
end;
-
> Кстати твое решение правильнее написать так.
Тогда переменная должна быть объявлена как LongBool а не Boolean.
-
> Тогда переменная должна быть объявлена как LongBool а не
> Boolean.
Иначе попадешь на AV.
-
> Tricky (03.09.08 23:45) [14]
Замечание действительное верное. Спасибо.
-
> oxffff © (03.09.08 23:35) [12]
> я предлагаю усложнить задачу.
> До
Завтра на работе доведу до конца. А сейчас иду спать.
-
> oxffff © (03.09.08 23:35) [12]
> я предлагаю усложнить задачу.
> До
Завтра на работе доведу до конца. А сейчас иду спать.
-
> просили же не подсказывать, едрен батон..
> а тут код вывалили
> шоб в начинающих так отвечали..
>
попросили программистов не подсказывать. мне тут недавно посоветовали пойти дельфи поучить и годика через три возвращаться, так что ко мне никаких претензий - я начинающий.
-
Ветка действительно интересная и поучительная, по крайней мере начало было таким, но все испоритили :(
Хотя с другой стороны, как можно определить(отличить) совсем-совсем начинающего от не совсем....
А так antonn и turbouser присвоили себе статус того, для кого эта задачка была?(вопрос) :)
-
> [19] antonn © (04.09.08 00:04)
> я начинающий.
совсем-совсем? :)
Чем докажешь? Задачу ведь решил...
:о)
-
> {RASkov} © (04.09.08 00:07) [20]
Есть задачка в [12].
Для кого она?
-
> [22] oxffff © (04.09.08 00:08)
> Для кого она?
Для извращенцев? :)
-
Для головоломов. :)
-
Ксатити я еще одно решение придумал для [12]. Не теперь точно спать. :)))))
-
> Для головоломов. :)
Для каких головоломов нафиг.. Ставится try Except в этот метод, затем обрабатываем какое нибудь Custom сообщение (вне этого метода) и если это оно (наше сообщение) делаем raise (соответственно выход на строке ProcessMessages), и выходим спокойно из цикла. По другому никак не выйдет, думай не думай.
-
> Чем докажешь? Задачу ведь решил...
> :о)
мнение авторитета не обсуждается, сказано - учить три года, значит начинающий :)
или так - :(
-
> [27] antonn © (04.09.08 00:20)
> значит начинающий :)
Начинающий - это уже круто, намного круче чем совсем-совсем начинающий...
Ответом в данной ветке, где была задача не для начинающих, а ниже - получается сам себя опустил еще ниже, чем это сделал авторитет?
:о)
Нужно всеж читать для кого задача и соображать, что ответом на задачу подписываешь(причисляешь) себя к тем, для кого была адресована задача...
-
> Нужно всеж читать для кого задача и соображать, что ответом
> на задачу подписываешь(причисляешь) себя к тем, для кого
> была адресована задача...
Чёт жестоко как-то.)
Получается, лучше вообще не отвечать кем бы то не был... :)
С другой стороны тут не ответ нужен, а начинающему самому попробывать решить данную задачу(просто для себя) и не хвалится ответом в данной ветке....
-
> easy © (03.09.08 23:19) [11]
> ...
> шоб в начинающих так отвечали..
>
Шоб в начинающих так спрашивали!