Текущий архив: 2008.10.26;
Скачать: CL | DM;
Вниз
Задачка для совсем-совсем начинающих Найти похожие ветки
← →
McSimm © (2008-09-04 09:53) [40]
> Кстати твое решение правильнее написать так.
>
> InterlockedExchange(@FFlag,0);
Зачем это здесь ?
← →
oxffff © (2008-09-04 10:01) [41]
> McSimm © (04.09.08 09:53) [40]
Во первых при работе на многопроцессорных машинах.
При переключении кэш другого процессора может не обновиться, и утрируя может получится ситуация, когда вы нажали на кнопку, а результат не мгновенный.
Однако сейчас ситуация усложняется тем, что есть тенденция делать обработку сообщений параллельно. Соответственно разные процессоры(ядра) могут не вовремя увидеть изменения. И будут задержки.
P.S. Готовь мозг к параллельным вычислениям с молоду.
← →
Rouse_ © (2008-09-04 10:17) [42]
> я предлагаю усложнить задачу.
> До
Эмнь... извращение конечно, но :)procedure Proc;
begin
ShowMessage("Процедура Proc стартовала");
while True do
begin
Sleep(1); // Это чтобы не грузить процессор
Application.ProcessMessages;
end;
ShowMessage("Процедура Proc завершилась");
end;
procedure TForm5.Button1Click(Sender: TObject);
begin
Proc;
end;
procedure WritePtrData(const Data: Word);
var
NopAddr: PBYTE;
Dumme: DWORD;
begin
NopAddr := @Proc;
Inc(NopAddr, 29);
WriteProcessMemory(GetCurrentProcess, NopAddr, @Data, 2, Dumme);
end;
procedure TimerProc(hend: THandle; uMsg: UINT;
idEvent: UINT_PTR; dwTime: DWORD); stdcall;
begin
KillTimer(0, idEvent);
WritePtrData($EBEB);
end;
procedure TForm5.Button2Click(Sender: TObject);
begin
WritePtrData($9090);
SetTimer(0, 0, 50, @TimerProc);
end;
← →
brother © (2008-09-04 10:20) [43]> procedure WritePtrData(const Data: Word);
> var
> NopAddr: PBYTE;
> Dumme: DWORD;
> begin
> NopAddr := @Proc;
> Inc(NopAddr, 29);
> WriteProcessMemory(GetCurrentProcess, NopAddr, @Data, 2,
> Dumme);
> end;
>
> procedure TimerProc(hend: THandle; uMsg: UINT;
> idEvent: UINT_PTR; dwTime: DWORD); stdcall;
> begin
> KillTimer(0, idEvent);
> WritePtrData($EBEB);
> end;
>
> procedure TForm5.Button2Click(Sender: TObject);
> begin
> WritePtrData($9090);
> SetTimer(0, 0, 50, @TimerProc);
> end;
вот про это я и говорил.... лезем в память, и понеслась! )
← →
oxffff © (2008-09-04 10:23) [44]
> Rouse_ © (04.09.08 10:17) [42]
:)
Да это одно из решений.
Именно он нем я написал в oxffff © (04.09.08 00:14) [25].
:)
А первое решение такое.
procedure Proc;
begin
ShowMessage("Ïðîöåäóðà Proc ñòàðòîâàëà");
while True do
begin
Sleep(1); // Ýòî ÷òîáû íå ãðóçèòü ïðîöåññîð
try
Application.ProcessMessages;
except
showmessage("YEs");
end;
end;
ShowMessage("Ïðîöåäóðà Proc çàâåðøèëàñü");
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Proc;
end;
{НУ это можно конечно сократить. }
procedure TForm1.Button2Click(Sender: TObject);
begin
asm
mov eax,fs:[0];
mov eax,[eax];
mov eax,[eax];
mov eax,[eax];
mov eax,[eax];
mov eax,[eax];
mov eax,[eax];
mov eax,[eax];
mov eax,[eax];
mov eax,[eax];
mov fs:[0],eax;
end;
RaiseException(0,0,0,nil);
end;
← →
Игорь Шевченко © (2008-09-04 10:26) [45]офигеть какие начинающие. воистину - фичи ради фич
← →
Ega23 © (2008-09-04 10:27) [46]
> Задание: одной кнопкой вызвать процедуру Proc с параметром
> True, другой кнопкой завершить ее. Менять код процедуры
> нельзя.
Дык параметр-то - var... :)
← →
oxffff © (2008-09-04 10:28) [47]
> Ega23 © (04.09.08 10:27) [46]
Там уже нет параметра. Внимательно [12].
← →
Медвежонок Пятачок © (2008-09-04 10:31) [48]Ой блииииин, ну вы и тормоза.....
:)
← →
Медвежонок Пятачок © (2008-09-04 10:32) [49]Можно я прикинусь не программистом и приведу решение?
← →
brother © (2008-09-04 10:36) [50]давай!
← →
Медвежонок Пятачок © (2008-09-04 10:37) [51]В [3] почти правильное решение.
Только одна процедура лишняя и один параметр задан неверно.
← →
brother © (2008-09-04 10:39) [52]ты напиши как надо...
← →
Юрий Зотов © (2008-09-04 11:00) [53]> Игорь Шевченко © (04.09.08 10:26) [45]
> фичи ради фич
Не так. Во-первых, это фича ради обучения. Новичок, решивший эту задачу навсегда усвоит, что такое передача параметров по ссылке и по значению.
Во-вторых, этот метод внешнего управления выходом из внутреннего цикла процедуры я как-то вполне реально использовал во вполне реальной программе (точнее, библиотеке).
← →
Игорь Шевченко © (2008-09-04 11:01) [54]Юрий Зотов © (04.09.08 11:00) [53]
Я имею в виду предложенные пути реализации
← →
Ega23 © (2008-09-04 11:02) [55]
> Во-вторых, этот метод внешнего управления выходом из внутреннего
> цикла процедуры я как-то вполне реально использовал во вполне
> реальной программе (точнее, библиотеке).
Вот в этом смысле - весьма интересное решение. Действительно можно брать на заметку... :)
← →
brother © (2008-09-04 11:04) [56]такое использовал, и не раз, работало)
← →
Игорь Шевченко © (2008-09-04 11:06) [57]
> Во-вторых, этот метод внешнего управления выходом из внутреннего
> цикла процедуры я как-то вполне реально использовал во вполне
> реальной программе (точнее, библиотеке).
Бить надо за такие вещи, где для выхода из внутреннего цикла используется внешнее управление (в смысле нет опроса внутри цикла)
← →
Юрий Зотов © (2008-09-04 11:11) [58]> Игорь Шевченко © (04.09.08 11:01) [54]
С этим согласен, за исключением [10]. Правда, и в [10] есть погрешность - что будет если нажать Button1 несколько раз подряд?
:о)
Заводя эту ветку, я все же рассчитывал на корректное поведение вполне взрослых людей (святая простота!) и предполагал, что пацаны сначала немного помучаются, а потом мы опубликуем решение [10] и поговорим с ними о способах передачи параметров и описателях var, const, in, out, а заодно и о том, что такое соглашения о вызове и как их использовать.
Увы, не получилось. Я забыл, где нахожусь и не учел особенностей контингента...
← →
oxffff © (2008-09-04 11:28) [59]
> Игорь Шевченко © (04.09.08 11:06) [57]
> Юрий Зотов © (04.09.08 11:11) [58]
Не сомневаюсь, что ваши побуждения были исключительно положительными.
Однобокость (шаблонность) мышления часто бывает неотъемлеммой чертой профессионала.
Однако гибкость мышления(из знание нескольких несвязанных вариантов решения) эта черта характеризует суперпрофессионала.
Поэтому задача была намеренно усложнена.
Не нужно учитывать особенностей контингента, это честно говоря слух режет.
Просто пострайтесь понять что существуют другие способы решения не академические.
А возможно постарайтесь понять(принять) их и взять себе на вооружение.
Ведь это форум, и здесь каждый чему то учится у другого.
А утверждать что решать задачи нужно имеено таким образом недальновидно. Найдется задача где обучаемый просто сядет в лужу.
Поскольку его мышление шаблонно, а пересторится бывает сами знаете ой как сложно.
← →
{RASkov} © (2008-09-04 11:32) [60]> [59] oxffff © (04.09.08 11:28)
> Поэтому задача была намеренно усложнена.
Вот дать тебе штангу в полтонны и заставить поднять.... Сразу супермэном станешь, ага? :)
← →
Игорь Шевченко © (2008-09-04 11:36) [61]
> Однобокость (шаблонность) мышления часто бывает неотъемлеммой
> чертой профессионала.
> Однако гибкость мышления(из знание нескольких несвязанных
> вариантов решения) эта черта характеризует суперпрофессионала.
>
Это, интересно, характерная черта данного форума или конкретных индивидуумов - огрызаться в ответ ?
← →
oxffff © (2008-09-04 11:36) [62]
> {RASkov} © (04.09.08 11:32) [60]
Я жал от груди 120 на 3. Сейчас не занимаюсь.
Я поступлю проще. Я распилю на 4 или 5 частей. И подниму частями.
Ведь задача решена не так ли?
← →
antonn © (2008-09-04 11:37) [63]
> пацаны сначала немного помучаются
местные "пацаны" в уме решат, а другие, с куда меньшими знаниями, тут не задерживаются. стараниями все тех же "пацанов".
← →
Юрий Зотов © (2008-09-04 11:44) [64]> oxffff © (04.09.08 11:28) [59]
Большое человеческое спасибо. Без Вас, суперпрофессонала, я так бы никогда и не узнал, что я - однобоко и шаблонно мыслящий профессионал, даже не подозревающий, что существуют и неакадемические способы решения задач. А также и о том, что это форум, где каждый чему-то учится у другого.
LOL.
Однако, даже и суперпрофессионалам тоже не помешало бы перестать мыслить однобоко и шаблонно. Да и просто хотя бы начать мыслить. Чтобы понять некоторые вещи, к программированию напрямую не относящиеся.
← →
oxffff © (2008-09-04 11:47) [65]
> Игорь Шевченко © (04.09.08 11:36) [61]
Почему вы настройчиво воспринимаете это именно так? :)
Будьте гибче, мы же учимся у друг друга.
Ключевая фраза друг у друга.
>Бить надо за такие вещи, где для выхода из внутреннего цикла >используется внешнее управление (в смысле нет опроса внутри цикла)
Однако почему в вашей фразе столько категоричности?
Однако, а что если есть код, исправить который нельзя, но нужно что-то придумать. Вы я так понимаю, скажите нас этому не учили? :)
← →
oxffff © (2008-09-04 11:54) [66]
> Юрий Зотов © (04.09.08 11:44) [64]
> > oxffff © (04.09.08 11:28) [59]
>
> Большое человеческое спасибо. Без Вас, суперпрофессонала,
> я так бы никогда и не узнал, что я - однобоко и шаблонно
> мыслящий профессионал, даже не подозревающий, что существуют
> и неакадемические способы решения задач. А также и о том,
> что это форум, где каждый чему-то учится у другого.
Улыбнуло. Честно.
А я лишь сказал, что человека нужно учить думать по разному, и понимать отличие одного от другого.
А не категорично говорить, что нужно делать именно так.
Вопрос как вы решите задачу [12], если она встанет перед вами?
Покажите еще одно решение.
← →
Игорь Шевченко © (2008-09-04 11:55) [67]oxffff © (04.09.08 11:47) [65]
Я не против учиться хорошему. Но такому, чтобы это хорошее не приходило в противоречие с уже усвоенным хорошим.
> Однако почему в вашей фразе столько категоричности?
>
> Однако, а что если есть код, исправить который нельзя, но
> нужно что-то придумать. Вы я так понимаю, скажите нас этому
> не учили? :)
Ну вот оттуда и категоричность, что "исправить нельзя". Значит, бить надо того, кто написал код, который "исправить нельзя".
Я слишком много за свою программистскую деятельность наблюдал последствий того, что "надо что-то придумать". Последствия, в основном, удручающие. Бывают, безусловно, и редкие исключения, но они только подтверждают правило - программа должна быть ясной и понятной.
← →
alley © (2008-09-04 12:01) [68]
> Rouse_ © (04.09.08 10:17) [42]
Написано ж - код процедуры менять нельзя, а ты меняешь, хоть и в рантайме :)
← →
oxffff © (2008-09-04 12:06) [69]
> Ну вот оттуда и категоричность, что "исправить нельзя".
> Значит, бить надо того, кто написал код, который "исправить
> нельзя".
> Я слишком много за свою программистскую деятельность наблюдал
> последствий того, что "надо что-то придумать". Последствия,
> в основном, удручающие. Бывают, безусловно, и редкие исключения,
> но они только подтверждают правило - программа должна быть
> ясной и понятной.
Мы все сталкиваемся с этим ежедневно.
Ну нельзя заставить человека соблюдать все правила.
Ну не может человек смотреть на 15 шагов вперед.
А пользоваться его творением нужно. А эти решения представлены.
← →
Игорь Шевченко © (2008-09-04 12:19) [70]
> Ну не может человек смотреть на 15 шагов вперед.
> А пользоваться его творением нужно. А эти решения представлены.
>
Тогда проще убить человека, раз он не может смотреть на 15 шагов вперед
← →
Юрий Зотов © (2008-09-04 12:22) [71]> oxffff © (04.09.08 11:54) [66]
Еще раз большое человеческое спасибо. Без Вас я так никогда и не узнал бы, что человека нужно учить думать по-разному и понимать отличие одного от другого. А всю оставшуюся жизнь категорично говорил бы, что нужно делать именно так.
Правда, я этого и не говорил (перечитайте ветку, о, внимательнейший!), но раз Вы, суперпрофессионал, так заявляете, то нам, сирым, не остается ничего другого, как только склонить главу перед почтенным гуру.
Однако, даже и суперпрофессионалам не мешало бы понимать некоторые элементарные вещи. В частности, что для того, чтобы человек смог думать по-разному, он должен знать значительно больше, чем новичок. И что для этого его сначала надо обучить хотя бы основам.
И ветка эта, как следует даже из ее названия, была заведена именно для НОВИЧКОВ, а не для упражнений по решению значительно более сложных задач. Поэтому полагаю, что пост [12] в ЭТОЙ ветке просто неуместен. Что Вам мешало завести СВОЮ ветку, а не оффтопить?
> как вы решите задачу [12], если она встанет перед вами?
Что задача (а, значит, и ее решение) нестандартны - это и козе понятно. Подобные задачи, как правило, решаются не вообще, а с учетом каких-то условий (например, что текст процедуры действительно в будущем не изменится (или изменится), что не будет (или будет) использован другой компилятор, другая ОС, другая аппаратная платформа и т.п.). Поэтому - когда такая задача встанет, тогда и буду решать, с учетом этих самых условий. Подобное было далеко не раз - и пока справлялся.
И на этом говорить о [12] я больше не буду, поскольку оффтоп. А к Вам есть конкретный вопрос: сколько конкретных людей Вы лично научили программировать? Назовите число.
← →
Rouse_ © (2008-09-04 12:26) [72]
> Написано ж - код процедуры менять нельзя, а ты меняешь,
> хоть и в рантайме :)
Так я ж не на Зотыча задачу решение приводил, а на
> oxffff © (03.09.08 23:35) [12]
← →
Игорь Шевченко © (2008-09-04 12:27) [73]"Кривое не может сделаться прямым" Еккл. 1. 15
← →
DiamondShark © (2008-09-04 14:07) [74]
> 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. Идеи кое какие на этот счет имеются, но до конца пока
> не довел.
Тоже мне бином Ньютона.
буттон1клик
Proc();
буттон2клик
Abort();
← →
DiamondShark © (2008-09-04 14:11) [75]
> oxffff © (04.09.08 10:01) [41]
Гонишь. Здесь один единственный поток.
← →
oxffff © (2008-09-04 14:14) [76]
> DiamondShark © (04.09.08 14:07) [74]
> Тоже мне бином Ньютона.
> буттон1клик
> Proc();
> буттон2клик
> Abort();
Гонишь по полной. Садись ДВА.
P.S. Осторожней с выражениями.
← →
oxffff © (2008-09-04 14:18) [77]
> DiamondShark © (04.09.08 14:11) [75]
Опять гонишь.
Представь ситуацию, что после Assign операции.
Произошло переключение потоков. А далее он стал выполняться на другом процессоре.
← →
oxffff © (2008-09-04 14:27) [78]
> А к Вам есть конкретный вопрос: сколько конкретных людей
> Вы лично научили программировать? Назовите число.
Как я или вы можете сказать, что научили программировать?
Во первых это(научил) исключительно не объективное понятие.
А судьи кто?
Во вторых научить программировать нельзя.
Можно научить кодировать в рамках конкретного языка.
Плюс привить определенные знания в области алгоритмов.
Все остальное человек делает самостоятельно.
И самое главное программист учится всю жизнь.
Если вы переформулируете вопрос сколько человек прошло через меня в рамках курсов по программированию. то я могу вам точно сказать.
4 группы школьников.
2 группы студентов III курса.
одна группа специалистов предприятий в рамках
плюс порядка 10 подчиненных, которым я старался повысить профессиональные знания.
← →
Slym © (2008-09-04 14:33) [79]Ответ на [12]
не меняя кода этой процедуры мы можем менять код вызываемых процедур :)
делаем сплайсинг слипаtype TSleepProc=procedure(milliseconds: Cardinal);stdcall;
procedure MySleep;
asm
pop EAX
add EAX, 14
pop EDX
push eax
end;
procedure Proc;
begin
ShowMessage("Процедура Proc стартовала");
while True do
begin
//Sleep(1);// Это чтобы не грузить процессор
TSleepProc(@MySleep)(1);//после сплайсинга
Application.ProcessMessages;
end;
ShowMessage("Процедура Proc завершилась");
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Proc;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Intercept(Sleep,MySleep);
end;
← →
DiamondShark © (2008-09-04 14:38) [80]
> oxffff © (04.09.08 14:14) [76]
Гоню. За пределы ProcessMessages исключения не выпускаются. ВЦЛ -- сволочь.
> oxffff © (04.09.08 14:18) [77]
И чё? Ну вот представь, что у тебя есть код:
while AnyVar do begin
//...
AnyVar := false;
end
После присваивания произошло переключение потоков. Что страшного случилось? Почему в этом случае ты не пишешь интерлокед-функцию, а полагаешься на простое присваивание?
По твоей логике, в этом коде есть вероятность лишней итерации цикла (если AnyVar -- не в регистре, а в пямяти).
Это ж ужас какие глюки должны испытывать обычные приложения в многопроцессорной среде.
Страницы: 1 2 3 вся ветка
Текущий архив: 2008.10.26;
Скачать: CL | DM;
Память: 0.66 MB
Время: 0.017 c