Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.56 MB
Время: 0.032 c
15-1161848304
VitV
2006-10-26 11:38
2006.11.12
Ваши настольные книги по Delphi


1-1159639343
Calibr
2006-09-30 22:02
2006.11.12
вопрос по Variant?


6-1150718257
Kryakozyablik
2006-06-19 15:57
2006.11.12
Подключение интернета (ADSL)


2-1161950690
Despo
2006-10-27 16:04
2006.11.12
Использование "..."


3-1157984318
abba
2006-09-11 18:18
2006.11.12
Структуированные записи