Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.10.26;
Скачать: CL | DM;

Вниз

Задачка для совсем-совсем начинающих   Найти похожие ветки 

 
Юрий Зотов ©   (2008-09-03 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 ©   (2008-09-03 22:49) [1]

Первые пять секунд после прочтения сообщения я с нарастающией скоростью падал в своих глазах...
потом дошло. :))


 
oxffff ©   (2008-09-03 22:54) [2]


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


Power?


 
@!!ex ©   (2008-09-03 23:04) [3]

procedure Start()
var
 T:boolean;
begin
 T:=true;
 Proc(T);
end;

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

Хотя это не то, что имелось ввиду, но условию задачи не противоречит. :)


 
antonn ©   (2008-09-03 23:05) [4]

и прервется? :)


 
antonn ©   (2008-09-03 23:06) [5]

halt


 
Zeqfreed ©   (2008-09-03 23:08) [6]

Если бросить исключение в Sleep или Application.ProcessMessages это считается «выходом»? :)


 
antonn ©   (2008-09-03 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   (2008-09-03 23:12) [8]

Вместо sleep(1) нужно поставить SwitchToThread. Так корректнее.


 
Tricky   (2008-09-03 23:13) [9]

Иначе дофигища ресурсов тратится. На каждый слип уходит примерно под 1000 тактов..


 
turbouser ©   (2008-09-03 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 ©   (2008-09-03 23:19) [11]

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


 
oxffff ©   (2008-09-03 23:35) [12]

я предлагаю усложнить задачу.
До

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

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

P.S. Идеи кое какие на этот счет имеются, но до конца пока не довел.


 
oxffff ©   (2008-09-03 23:38) [13]


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


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

procedure TForm1.Button2Click(Sender: TObject);
begin
InterlockedExchange(@FFlag,0);
end;


 
Tricky   (2008-09-03 23:45) [14]


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


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


 
Tricky   (2008-09-03 23:46) [15]


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

Иначе попадешь на AV.


 
oxffff ©   (2008-09-03 23:55) [16]


> Tricky   (03.09.08 23:45) [14]


Замечание действительное верное. Спасибо.


 
oxffff ©   (2008-09-03 23:56) [17]


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


Завтра на работе доведу до конца. А сейчас иду спать.


 
oxffff ©   (2008-09-03 23:56) [18]


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


Завтра на работе доведу до конца. А сейчас иду спать.


 
antonn ©   (2008-09-04 00:04) [19]


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

попросили программистов не подсказывать. мне тут недавно посоветовали пойти дельфи поучить и годика через три возвращаться, так что ко мне никаких претензий - я начинающий.


 
{RASkov} ©   (2008-09-04 00:07) [20]

Ветка действительно интересная и поучительная, по крайней мере начало было таким, но все испоритили :(
Хотя с другой стороны, как можно определить(отличить) совсем-совсем начинающего от не совсем....
А так antonn и turbouser присвоили себе статус того, для кого эта задачка была?(вопрос) :)


 
{RASkov} ©   (2008-09-04 00:08) [21]

> [19] antonn ©   (04.09.08 00:04)
> я начинающий.

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


 
oxffff ©   (2008-09-04 00:08) [22]


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


Есть задачка в [12].
Для кого она?


 
{RASkov} ©   (2008-09-04 00:10) [23]

> [22] oxffff ©   (04.09.08 00:08)
> Для кого она?

Для извращенцев? :)


 
oxffff ©   (2008-09-04 00:11) [24]

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


 
oxffff ©   (2008-09-04 00:14) [25]

Ксатити я еще одно решение придумал для [12]. Не теперь точно спать. :)))))


 
Tricky   (2008-09-04 00:16) [26]


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


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


 
antonn ©   (2008-09-04 00:20) [27]


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

мнение авторитета не обсуждается, сказано - учить три года, значит начинающий :)
или так - :(


 
{RASkov} ©   (2008-09-04 00:36) [28]

> [27] antonn ©   (04.09.08 00:20)
> значит начинающий :)

Начинающий - это уже круто, намного круче чем совсем-совсем начинающий...
Ответом в данной ветке, где была задача не для начинающих, а ниже - получается сам себя опустил еще ниже, чем это сделал авторитет?
:о)
Нужно всеж читать для кого задача и соображать, что ответом на задачу подписываешь(причисляешь) себя к тем, для кого была адресована задача...


 
{RASkov} ©   (2008-09-04 00:45) [29]

> Нужно всеж читать для кого задача и соображать, что ответом
> на задачу подписываешь(причисляешь) себя к тем, для кого
> была адресована задача...

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


 
Германн ©   (2008-09-04 00:50) [30]


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

Шоб в начинающих так спрашивали!


 
KilkennyCat ©   (2008-09-04 08:22) [31]

А я не понял вопроса...


 
brother ©   (2008-09-04 08:38) [32]

а зачем эта задачка? я не понял, что она должна показать?


 
oxffff ©   (2008-09-04 09:11) [33]


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


Во первых так не получится.

Увы нафиг так не получится.
Даже, если ты поставишь try except в метод [12] (чего по условию задачи делать нельзя. А именно нельзя менять код [12]. Ну да ладно игнорируем это правило) и сгенерируешь исключение в user message handler, то proc об этом не узнает.
И в try except свой нафиг не попадешь.

Но напоминаю, что задача при нажатии на вторую кнопку покинуть  proc.

>По другому никак не выйдет, думай не думай.

Думай. Думай.


 
Skyle ©   (2008-09-04 09:13) [34]


> oxffff ©   (04.09.08 09:11) [33]


> >По другому никак не выйдет, думай не думай.
>
> Думай. Думай.

А что думать, ответ уже в ветке дали :(


 
oxffff ©   (2008-09-04 09:13) [35]

>oxffff ©   (04.09.08 09:11) [33]

Кнопки естественно не на чистом API, а VCL обертках.


 
oxffff ©   (2008-09-04 09:14) [36]


> Skyle ©   (04.09.08 09:13) [34]


Дык, уже новая задача в см [12].


 
brother ©   (2008-09-04 09:16) [37]

> Дык, уже новая задача в см

новая то она новая, только реализация ее будет через одно место, тк это не стандартный подход к тз


 
oxffff ©   (2008-09-04 09:18) [38]


> brother ©   (04.09.08 09:16) [37]


Ты уже знаешь решение?


 
brother ©   (2008-09-04 09:21) [39]

понятия не имею, но судя из исходных данных, точно через одно место...


 
McSimm ©   (2008-09-04 09:53) [40]


> Кстати твое решение правильнее написать так.
>
> InterlockedExchange(@FFlag,0);

Зачем это здесь ?



Страницы: 1 2 3 вся ветка

Текущий архив: 2008.10.26;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.017 c
2-1221563831
sD
2008-09-16 15:17
2008.10.26
Как произвести логическое уножение чисел


2-1221731916
cyborg
2008-09-18 13:58
2008.10.26
Нужен совет по выбору компонента


4-1198653645
Rav
2007-12-26 10:20
2008.10.26
Как опеределить язык GUI Windows!!! Не GetSystemDefaultLCID!!!


2-1221640600
Drowsy
2008-09-17 12:36
2008.10.26
=Bookmark= и


15-1220271337
zorik
2008-09-01 16:15
2008.10.26
Построение поверхности за границами изолиний