Текущий архив: 2006.11.12;
Скачать: CL | DM;
ВнизМожно ли создать событие на изменение переменной? Найти похожие ветки
← →
Ingwar © (2006-10-27 00:41) [0]Сейчас пока сделал поток, который следит за изменением переменной... Только эта зараза жрет все ресурсы процессора. Может возможно сделать это как-нить по другому?
procedure ThreadDemo.Execute;
begin
repeat
if (Head<>Read) then
begin
Synchronize(Update);
end;
until False
end;
← →
DrPass © (2006-10-27 00:49) [1]Переделать логику таким образом, чтобы не было Synchonize, и еще добавить в цикл sleep(<сколько можно>)
← →
Leonid Troyanovsky © (2006-10-27 00:52) [2]
> Ingwar © (27.10.06 00:41)
> Сейчас пока сделал поток, который следит за изменением переменной.
Сделай лучше свойство (property), скажем, у формы.
--
Regards, LVT.
← →
MetalFan_pda (2006-10-27 00:55) [3]а как поток завершится,если в н6м безусловный бесконечный цикл??ужас!
а если проперти сделать,с отслеживанием ее изменения вроде проблемы быть не должно...
← →
Ingwar © (2006-10-27 00:58) [4]То DrPass: В той доке которую я читал про поток написано, что отображение на форму надо делать через Synchonize... А у меня как раз обновление формы по при приходу данных... А Head и Read это указатели на кольцевой буфер.
То Leonid Troyanovsky: А можно чуть поподробней? А то я никогда не сталкивался с подобным...
Заранее благодарен за любые посказки!
← →
Gero © (2006-10-27 00:59) [5]Переменную кто меняет? Ты? Тогда ты и так знаешь, когда она меняется, ничего отслеживать не нужно.
← →
Ketmar © (2006-10-27 00:59) [6]>[0] Ingwar(c) 27-Oct-2006, 00:41
читай про CreateEvent(), PulseEvent(), WaitForSingleObject(). вместе с изменением переменной дёргай event. в потоке -- WaitForSingleObject(). жрать ресурсы перестанет.
(это развёрнутое изложение [1] %-)
← →
Ingwar © (2006-10-27 01:01) [7]То MetalFan_pda: Завершится легко... При завершении приложения.
Так уже второй человек говорит про свойство... Пойду капать в эту сторону... Но если будут более конкретные подсказки (с фрагментом кода) я не обижусь =)
← →
Ingwar © (2006-10-27 01:05) [8]ТО Ketmar: Ты как всегда рулишь... Коротко и ясно =)
← →
DrPass © (2006-10-27 01:07) [9]
> В той доке которую я читал про поток написано, что отображение
> на форму надо делать через Synchonize
Правильно написано. Но там не написано, что при использовании Syncronize многопоточность не работает, и его всячески нужно избегать, применяя только при крайней необходимости. Если нужно что-то сказать главной форме, лучше брось ей сообщение через SendMessage.
← →
Ketmar © (2006-10-27 01:07) [10]>[8] Ingwar(c) 27-Oct-2006, 01:05
>ТО Ketmar: Ты как всегда рулишь... Коротко и ясно =)
ты, кажется, первый, кто так считает из начинающих. %-)
← →
Anatoly Podgoretsky © (2006-10-27 01:08) [11]Если свойство, то ничего отлавливать не надо, оно само себя поймает и может оповестить заинтересованых лиц.
← →
Gero © (2006-10-27 01:08) [12]> [10] Ketmar © (27.10.06 01:07)
Растет.
← →
DrPass © (2006-10-27 01:09) [13]
> Ketmar © (27.10.06 01:07) [10]
Остальные обычно хотят тебя убить
← →
Anatoly Podgoretsky © (2006-10-27 01:09) [14]
> Но там не написано, что при использовании Syncronize многопоточность
> не работает
Но здесь оно правильно применено, только для обновления, а не для выполнения работы в главном потоке.
← →
Leonid Troyanovsky © (2006-10-27 01:10) [15]
> Ingwar © (27.10.06 00:58) [4]
type
TForm1 = class(TForm)
..
private
{ Private declarations }
FX: Longint;
procedure SetX(const Value: Longint); virtual;
public
{ Public declarations }
property X: Longint read FX write SetX;
end;
procedure TForm1.SetX;
begin
if Value <> FX then
begin
FX := Value;
ShowMessage(IntToStr(FX)); // побочный эффект
end;
end;
Т.е., при назначениях x := .. будет вызываться ShowMessage
--
Regards, LVT.
← →
Ingwar © (2006-10-27 01:12) [16]То Anatoly Podgoretsky: А со свойством как? Просто инетерсно... Мона примерчик или ссылку на литературу. Буду очень признателен =)
← →
Ketmar © (2006-10-27 01:12) [17]>[9] DrPass(c) 27-Oct-2006, 01:07
>лучше брось ей сообщение через SendMessage.
ты имел в виду PostMessage(), правда? %-)
>[13] DrPass(c) 27-Oct-2006, 01:09
>Остальные обычно хотят тебя убить
это ничего. обожаю негатив -- я ним питаюсь.
>[14] Anatoly Podgoretsky(c) 27-Oct-2006, 01:09
>Но здесь оно правильно применено, только для обновления, а
>не для выполнения работы в главном потоке.
и всё равно можно сделать PostMessage(). %-)
← →
Ketmar © (2006-10-27 01:13) [18]>[16] Ingwar(c) 27-Oct-2006, 01:12
см. [15]
← →
DrPass © (2006-10-27 01:14) [19]
> Но здесь оно правильно применено, только для обновления,
> а не для выполнения работы в главном потоке.
Сложно сказать... в данном потоке выполняется две крохотные инструкции сравнения 0.001% его времени работы и оставшиеся 99.999% - эта самая процедура переключения контекстов. Архангельский уснул бы удовлетворенным
← →
DrPass © (2006-10-27 01:17) [20]
> ты имел в виду PostMessage(), правда? %-)
Я бы хотел иметь в виду PostMessage, но раз я уже написал SendMessage, автору теперь придется мучиться с зависанием приложения...
← →
Ketmar © (2006-10-27 01:20) [21]>[19] DrPass(c) 27-Oct-2006, 01:14
зато автор по ходу дела имеет шанс научиться работать с потоками и событиями. тоже полезно. а потом хлопнет себя по лбу, сделает свойство, и навсегда запомнит, как не надо решать проблемы. %-)
← →
Ingwar © (2006-10-27 01:22) [22]Спасибо за [15]! Первый раз вижу такую конструкцию... Сча буду разбирать как работает =)
Похоже спать мне сегодня не придется... стока всего инетерсного узнал!
← →
Ketmar © (2006-10-27 01:25) [23]>[22] Ingwar(c) 27-Oct-2006, 01:22
>Первый раз вижу такую конструкцию...
это потому, что язык не учил. %-)
← →
Ingwar © (2006-10-27 01:35) [24]Текс... А про PostMessage мона тоже немного просвятить?
И еще, если я правильно понял, что создание свойства позволяет избавится от потока. Или нет?
И еще возник вопрос. Тут сказали что при Syncronize не работает многопоточность. А работает ли многопоточность при обновлении данных на форме? Просто у меня толи доки не полные, толи я немного запутался.
← →
Ketmar © (2006-10-27 01:40) [25]>[24] Ingwar(c) 27-Oct-2006, 01:35
>Текс... А про PostMessage мона тоже немного просвятить?
оно тебе надо сейчас? осмысли пока то, что есть. %-)
>И еще, если я правильно понял, что создание свойства
>позволяет избавится от потока. Или нет?
в этом твоём конкретном случае -- да.
>И еще возник вопрос. Тут сказали что при Syncronize не
>работает многопоточность. А работает ли многопоточность
>при обновлении данных на форме?
а точнее? что есть "обновление данных на форме"?
← →
Ingwar © (2006-10-27 01:42) [26]То Ketmar: Ты прав... не учил... Я учусь на чужих исходниках разбираясь как оно работает, так повелось еще со спектрума...
И еще к тебе вопрос: Не посоветуешь где подробнее прочесть про CreateEvent... Просто я нашел всего один примерчик "отложенной операции чтения". А по Ф1 в D7 ничего не ищется =(
← →
Ingwar © (2006-10-27 01:47) [27][25] Имелось ввиду обновления любых данных на форме, например:
Label1.Caption := "Чего-то там";
и т.д. Просто в моих доках про ничего толком про Syncronize не написано, кроме того что его надо использовать при выводе данных на форму. А тут я узнаю, что при Syncronize многопоточность "умирает". Вот и хотелось бы узнать эти вещи связаны как-то между собой или нет.
← →
Ketmar © (2006-10-27 01:47) [28]>[26] Ingwar(c) 27-Oct-2006, 01:42
всё интересное есть в MSDN. %-) в принципе, вполне достаточно, чтобы разобраться. коли ты привык "методом тыка", то особых сложностей быть не должно. главное -- читай внимательно.
а вообще -- сначала полезно почитать что-то по винде "в общем". и уровнем пониже Delphi. того же Петзольда, например. потом Фэнь Яня, Рихтера... потом придёшь сюда и будешь весело пинать новичков -- как мы. %-)
← →
Ketmar © (2006-10-27 01:50) [29]>[27] Ingwar(c) 27-Oct-2006, 01:47
ох... когда ты пишешь Synchronize(Update), то оно ждёт окончания Update. или любого другого метода, который ты передаёшь Synchronize(). натурально, если ты в теле метода делаешь код из [27], например, то поток ждёт в это время. проще говоря: рассматривай Synchronize(xxx) как вызов процедуры xxx(). пока эта процедура не отработает, поток выполняться не будет.
← →
Ingwar © (2006-10-27 01:52) [30]Пинать не есть хорошо... А вот направлять это более правильный подход. Если человека направить в нужную сторону, то он либо поймет, либо этот человек потерян для общества... Я обычно так проверяю =)
Единственная загвоздка при таком подходе правильно определить исходный уровень юнита, чтобы не дать ему сверхнепосильную задачу с которой он явно не справится.
← →
Ketmar © (2006-10-27 01:56) [31]>[30] Ingwar(c) 27-Oct-2006, 01:52
>Пинать не есть хорошо...
зато действенно. или полетит, или лопнет. лопнет -- фиг с ним, не повезло. возьмём следующего. %-)
если подумать: зачем нам конкуренты из молодёжи? %-)
← →
Ingwar © (2006-10-27 02:22) [32]Ketmar, вот ты такой умный. Не подскажешь ли как можно узнать сколько по времени выполняется фрагмент кода?
← →
Ketmar © (2006-10-27 02:33) [33]>[32] Ingwar(c) 27-Oct-2006, 02:22
>Ketmar, вот ты такой умный.
это тебе кто-то наврал.
>узнать сколько по времени выполняется фрагмент кода?
GetTickCount() до и после. или QueryPerformanceCounter() для более точного измерения. но всё равно latency будет -- винда многозадачная.
есть и другие методы, но я описывать не стану. рано ещё. %-)
← →
Германн © (2006-10-27 02:35) [34]
> Ingwar © (27.10.06 02:22) [32]
>
> Ketmar, вот ты такой умный. Не подскажешь ли как можно узнать
> сколько по времени выполняется фрагмент кода?
>
GetTickCount поможет ОРД.
Страницы: 1 вся ветка
Текущий архив: 2006.11.12;
Скачать: CL | DM;
Память: 0.53 MB
Время: 0.039 c