Форум: "Прочее";
Текущий архив: 2008.10.26;
Скачать: [xml.tar.bz2];
ВнизЗадачка для совсем-совсем начинающих Найти похожие ветки
← →
Юрий Зотов © (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;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.007 c