Конференция "Прочее" » Задачка для совсем-совсем начинающих
 
  • Юрий Зотов © (03.09.08 22:46) [0]
    Программистов прошу не подсказывать!!!

    Есть такая процедура:

    procedure Proc(var Flag: boolean);
    begin
     ShowMessage('Процедура Proc стартовала');
     while Flag do
     begin
       Sleep(1); // Это чтобы не грузить процессор
       Application.ProcessMessages;
     end;
     ShowMessage('Процедура Proc завершилась');
    end;



    Задание: одной кнопкой вызвать процедуру Proc с параметром True,  другой кнопкой завершить ее. Менять код процедуры нельзя.
  • @!!ex © (03.09.08 22:49) [1]
    Первые пять секунд после прочтения сообщения я с нарастающией скоростью падал в своих глазах...
    потом дошло. :))
  • oxffff © (03.09.08 22:54) [2]

    >  другой кнопкой завершить ее.


    Power?
  • @!!ex © (03.09.08 23:04) [3]
    procedure Start()
    var
     T:boolean;
    begin
     T:=true;
     Proc(T);
    end;

    procedure Stop();
    begin
     Application.Terminate();
    end;


    Хотя это не то, что имелось ввиду, но условию задачи не противоречит. :)
  • antonn © (03.09.08 23:05) [4]
    и прервется? :)
  • antonn © (03.09.08 23:06) [5]
    halt
  • Zeqfreed © (03.09.08 23:08) [6]
    Если бросить исключение в Sleep или Application.ProcessMessages это считается «выходом»? :)
  • antonn © (03.09.08 23:09) [7]
    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 по вкусу, назначить один обработчик :)
    это есть не нравится вылет приложения :)
  • Tricky (03.09.08 23:12) [8]
    Вместо sleep(1) нужно поставить SwitchToThread. Так корректнее.
  • Tricky (03.09.08 23:13) [9]
    Иначе дофигища ресурсов тратится. На каждый слип уходит примерно под 1000 тактов..
  • turbouser © (03.09.08 23:15) [10]
    var
     Form1: TForm1;
     FFlag:boolean;
    implementation

    {$R *.dfm}

    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;

  • easy © (03.09.08 23:19) [11]
    просили же не подсказывать, едрен батон..
    а тут код вывалили
    шоб в начинающих так отвечали..
  • oxffff © (03.09.08 23:35) [12]
    я предлагаю усложнить задачу.
    До

    procedure Proc;
    begin
    ShowMessage('Процедура Proc стартовала');
    while True do
    begin
      Sleep(1); // Это чтобы не грузить процессор
      Application.ProcessMessages;
    end;
    ShowMessage('Процедура Proc завершилась');
    end;

    на одной кнопке запуск
    на второй корретный выход.

    P.S. Идеи кое какие на этот счет имеются, но до конца пока не довел.
  • oxffff © (03.09.08 23:38) [13]

    > turbouser ©   (03.09.08 23:15) [10]


    Кстати твое решение правильнее написать так.

    procedure TForm1.Button2Click(Sender: TObject);
    begin
    InterlockedExchange(@FFlag,0);
    end;
  • Tricky (03.09.08 23:45) [14]

    > Кстати твое решение правильнее написать так.


    Тогда переменная должна быть объявлена как LongBool а не Boolean.
  • Tricky (03.09.08 23:46) [15]

    > Тогда переменная должна быть объявлена как LongBool а не
    > Boolean.

    Иначе попадешь на AV.
  • oxffff © (03.09.08 23:55) [16]

    > Tricky   (03.09.08 23:45) [14]


    Замечание действительное верное. Спасибо.
  • oxffff © (03.09.08 23:56) [17]

    > oxffff ©   (03.09.08 23:35) [12]
    > я предлагаю усложнить задачу.
    > До


    Завтра на работе доведу до конца. А сейчас иду спать.
  • oxffff © (03.09.08 23:56) [18]

    > oxffff ©   (03.09.08 23:35) [12]
    > я предлагаю усложнить задачу.
    > До


    Завтра на работе доведу до конца. А сейчас иду спать.
  • antonn © (04.09.08 00:04) [19]

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

    попросили программистов не подсказывать. мне тут недавно посоветовали пойти дельфи поучить и годика через три возвращаться, так что ко мне никаких претензий - я начинающий.
 
Конференция "Прочее" » Задачка для совсем-совсем начинающих
Есть новые Нет новых   [134442   +13][b:0][p:0.001]