-
Программистов прошу не подсказывать!!!Есть такая процедура:
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]
> я предлагаю усложнить задачу.
> До
Завтра на работе доведу до конца. А сейчас иду спать.
-
> просили же не подсказывать, едрен батон..
> а тут код вывалили
> шоб в начинающих так отвечали..
>
попросили программистов не подсказывать. мне тут недавно посоветовали пойти дельфи поучить и годика через три возвращаться, так что ко мне никаких претензий - я начинающий.