Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
15-1219566319
Kostafey
2008-08-24 12:25
2008.10.26
Посоветуйте операционную систему для архаичного PC


15-1220127613
Anatoly Podgoretsky
2008-08-31 00:20
2008.10.26
Система Рада


15-1220358822
Interior
2008-09-02 16:33
2008.10.26
Что лучше использовать для управления рабочими столами


2-1221648561
renex
2008-09-17 14:49
2008.10.26
вызов функции из другого модуля


2-1221580076
Грек
2008-09-16 19:47
2008.10.26
Отловить клик по Subitems у ListView





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский