Конференция "Прочее" » Задачка для совсем-совсем начинающих
 
  • Юрий Зотов © (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]

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

    попросили программистов не подсказывать. мне тут недавно посоветовали пойти дельфи поучить и годика через три возвращаться, так что ко мне никаких претензий - я начинающий.
  • {RASkov} © (04.09.08 00:07) [20]
    Ветка действительно интересная и поучительная, по крайней мере начало было таким, но все испоритили :(
    Хотя с другой стороны, как можно определить(отличить) совсем-совсем начинающего от не совсем....
    А так antonn и turbouser присвоили себе статус того, для кого эта задачка была?(вопрос) :)
  • {RASkov} © (04.09.08 00:08) [21]
    > [19] antonn ©   (04.09.08 00:04)
    > я начинающий.

    совсем-совсем? :)
    Чем докажешь? Задачу ведь решил...
    :о)
  • oxffff © (04.09.08 00:08) [22]

    > {RASkov} ©   (04.09.08 00:07) [20]


    Есть задачка в [12].
    Для кого она?
  • {RASkov} © (04.09.08 00:10) [23]
    > [22] oxffff ©   (04.09.08 00:08)
    > Для кого она?

    Для извращенцев? :)
  • oxffff © (04.09.08 00:11) [24]
    Для головоломов. :)
  • oxffff © (04.09.08 00:14) [25]
    Ксатити я еще одно решение придумал для [12]. Не теперь точно спать. :)))))
  • Tricky (04.09.08 00:16) [26]

    > Для головоломов. :)


    Для каких головоломов нафиг.. Ставится try Except в этот метод, затем обрабатываем какое нибудь Custom сообщение (вне этого метода) и если это оно (наше сообщение) делаем raise (соответственно выход на строке ProcessMessages), и выходим спокойно из цикла. По другому никак не выйдет, думай не думай.
  • antonn © (04.09.08 00:20) [27]

    > Чем докажешь? Задачу ведь решил...
    > :о)

    мнение авторитета не обсуждается, сказано - учить три года, значит начинающий :)
    или так - :(
  • {RASkov} © (04.09.08 00:36) [28]
    > [27] antonn ©   (04.09.08 00:20)
    > значит начинающий :)

    Начинающий - это уже круто, намного круче чем совсем-совсем начинающий...
    Ответом в данной ветке, где была задача не для начинающих, а ниже - получается сам себя опустил еще ниже, чем это сделал авторитет?
    :о)
    Нужно всеж читать для кого задача и соображать, что ответом на задачу подписываешь(причисляешь) себя к тем, для кого была адресована задача...
  • {RASkov} © (04.09.08 00:45) [29]
    > Нужно всеж читать для кого задача и соображать, что ответом
    > на задачу подписываешь(причисляешь) себя к тем, для кого
    > была адресована задача...

    Чёт жестоко как-то.)
    Получается, лучше вообще не отвечать кем бы то не был... :)
    С другой стороны тут не ответ нужен, а начинающему самому попробывать решить данную задачу(просто для себя) и не хвалится ответом в данной ветке....
  • Германн © (04.09.08 00:50) [30]

    > easy ©   (03.09.08 23:19) [11]
    >  ...
    > шоб в начинающих так отвечали..
    >

    Шоб в начинающих так спрашивали!
 
Конференция "Прочее" » Задачка для совсем-совсем начинающих
Есть новые Нет новых   [134442   +13][b:0][p:0.002]